<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sh_-s2.log</title>
        <link>https://velog.io/</link>
        <description>ing..</description>
        <lastBuildDate>Mon, 04 Aug 2025 00:23:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sh_-s2.log</title>
            <url>https://velog.velcdn.com/images/sh_-s2/profile/865f65b1-0959-4640-83b3-7b95b601bf5d/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sh_-s2.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sh_-s2" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ORM과 JPA 알아보]]></title>
            <link>https://velog.io/@sh_-s2/ORM%EA%B3%BC-JPA-%EC%95%8C%EC%95%84%EB%B3%B4</link>
            <guid>https://velog.io/@sh_-s2/ORM%EA%B3%BC-JPA-%EC%95%8C%EC%95%84%EB%B3%B4</guid>
            <pubDate>Mon, 04 Aug 2025 00:23:19 GMT</pubDate>
            <description><![CDATA[<h3 id="orm-이란">ORM 이란?</h3>
<blockquote>
<p>ORM은 Object-Relational Mapping의 약자로, 객체 지향 프로그래밍 언어에서 <strong>객체와 관계형 데이터베이스의 데이터를 매핑</strong>해주는 기술을 말함
ORM을 사용하면 <strong>데이터베이스 테이블을 클래스에 매핑하고, SQL 쿼리를 직접 작성하지 않고도 객체의 상태를 데이터베이스에 저장</strong>하거나 불러올 수 있음</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/c6735e87-7948-4116-95a2-1f6cd9c6e1cd/image.png" alt=""></p>
<h4 id="orm-더-알아보기">ORM 더 알아보기</h4>
<p><strong>ORM 장점</strong></p>
<ul>
<li><strong>SQL 추상화</strong> : 직접 SQL을 작성할 필요 없이 객체로 데이터를 다룰 수 있음</li>
<li><strong>코드 간결화</strong> : 데이터베이스와의 상호작용을 객체 지향적으로 다룰 수 있어 코드가 직관적이고 깔끔해짐</li>
<li><strong>성능 최적화</strong> : 지연 로딩(Lazy Loading)이나 캐싱 등을 통해 데이터베이스와의 상호작용을 효율적으로 처리할 수 있음</li>
</ul>
<table>
<thead>
<tr>
<th>언어</th>
<th>ORM 종류</th>
</tr>
</thead>
<tbody><tr>
<td>Java</td>
<td>Hibernate, JPA, MyBatis</td>
</tr>
<tr>
<td>Python</td>
<td>Django ORM, SQLAlchemy</td>
</tr>
<tr>
<td>JavaScript</td>
<td>TypeORM, Sequelize, Prisma</td>
</tr>
</tbody></table>
<p>🫤 <strong>ORM은 프로젝트의 성격이나 사용하는 프로그래밍 언어에 따라 어떤 걸 쓰는 게 좋을 지 선택해야해!</strong></p>
<p><strong>예를 들면,</strong></p>
<p>실시간 처리 등 성능이 중요한 시스템은 가볍고 빠른 ORM을 쓰는게 좋음 → ex) MyBatis</p>
<p>주로 이런 ORM은 SQL을 직접 쓰기 때문에 속도가 빠르고 유연한 편임</p>
<p>빠르게 개발해야 하는 경우에는 풀 기능을 제공하는 ORM을 쓰는게 좋음 → ex) JPA</p>
<p>이런  ORM은 자동으로 SQL을 만들어줌</p>
<p>🤗 자바 기반 SpringFramework 사용 시에는 JPA를 일반적으로 많이 사용함!</p>
<h3 id="jpa-더-알아보기">JPA 더 알아보기</h3>
<blockquote>
<p>💡<strong>JPA는 뭘까?!</strong>
JPA는 Java Persistence API의 약자로 <strong>Java에서 ORM을 표준화 해놓은 API(명세)를 의미</strong>함
즉, Java 객체를 데이터베이스에 쉽게 저장하고 관리할 수 있도록 만든 <strong>표준 인터페이스</strong></p>
</blockquote>
<p>🫤 <strong>JPA는 인터페이스인데 그럼 구현체가 없는거 아니야?</strong></p>
<p>→ JPA는 인터페이스만 정의해 놓은 표준이라 실제로 동작하려면 구현체가 필요함!
→ <strong>가장 대표적인 구현체는 Hibernate!</strong></p>
<h4 id="🌟-jpa-장점과-단점">🌟 <strong>JPA 장점과 단점</strong></h4>
<p>📌 <strong>JPA 장점</strong></p>
<ul>
<li>SQL을 거의 안써도 됨 (자동 생성)</li>
<li>객체 지항적으로 개발 가능</li>
<li>캐시, 지연 로딩, 변경 감지 등 고급 기능 제공</li>
<li>유지보수 쉬움</li>
</ul>
<p>📌 <strong>JPA 단점</strong></p>
<ul>
<li>내부 동작 이해가 필요 (처음 사용 시 사용 방법을 공부해야함)</li>
<li>단순한 CRUD는 편하지만, 복잡한 쿼리는 오히려 불편할 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[딥러닝 맛보기(성적회귀예측)]]></title>
            <link>https://velog.io/@sh_-s2/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A7%9B%EB%B3%B4%EA%B8%B0%EC%84%B1%EC%A0%81%ED%9A%8C%EA%B7%80%EC%98%88%EC%B8%A1</link>
            <guid>https://velog.io/@sh_-s2/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A7%9B%EB%B3%B4%EA%B8%B0%EC%84%B1%EC%A0%81%ED%9A%8C%EA%B7%80%EC%98%88%EC%B8%A1</guid>
            <pubDate>Mon, 30 Jun 2025 07:28:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="딥러닝-개요">딥러닝 개요</h2>
</blockquote>
<ul>
<li>인간의 신경망을 모방하여 학습하고 예측하는 기술</li>
<li>대량의 데이터에서 규칙을 발견하거나 패턴을 찾아내는 능력이 뛰어남.</li>
<li>머신러닝에 비해 판단이 유연 (인간의 추상적 사고 구현)</li>
<li>인간의 뉴런 == 딥러닝의 선형모델</li>
<li>주로 이미지 처리, 영상, 음성처리 등에 활용</li>
</ul>
<blockquote>
<p>##</p>
</blockquote>
<ul>
<li>머신러닝 : sklearn</li>
<li>딥러닝 : tensorflow, leras, pytorch 등<ul>
<li>수업에는 tensorflow, keras 사용</li>
<li>keras 딥러닝을 쉽게 구현하기 위한 클래스와 함수들 제공</li>
</ul>
</li>
</ul>
<blockquote>
<h3 id="목표">목표</h3>
</blockquote>
<ul>
<li>동일한 데이터를 가지고 머신러닝, 딥러닝 모델링을 통해 차이점을 알아보자.</li>
<li>공부시간에 따른 수학시험 점수 예측 모델링</li>
</ul>
<blockquote>
<h3 id="머신러닝-vs-딥러닝">머신러닝 vs 딥러닝</h3>
</blockquote>
<ul>
<li>머신러닝<ul>
<li>모델 객체 생성 ( 완성형 ) &gt; 학습 &gt; 평가 &gt; 예측</li>
<li>완성형 로봇 형태( 팔정도는 움직이기 가능 ( 하이퍼파라미터 튜닝 ) )</li>
</ul>
</li>
</ul>
<blockquote>
<ul>
<li>딥러닝<ul>
<li>모델 객체 생성 ( 모델 직접 구성, 신경망 직접 설계 ) &gt; 컴파일 &gt; 학습 &gt; 평가 &gt; 예측</li>
<li>조립식 모델에 비유( 개발자가 구성하고자 하는 모양으로 설계 가능 )</li>
<li>다양한 결과를 만들어 낼 수 잇음</li>
</ul>
</li>
</ul>
</blockquote>
<pre><code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt</code></pre><pre><code># 파일 가져오기
data = pd.read_csv(&#39;./data/student-mat.csv&#39;)
data.head(5)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/870a31a7-3f65-400f-bc1f-556e3b2d2419/image.png" alt=""></p>
<pre><code># 데이터 분리
# 문제 정답 데이터 알고 분리
data.info               # G1, G2, G3 시험 점수</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/d27cbc1a-4c4a-4c94-b5c6-f83c7f14eb5b/image.png" alt=""></p>
<pre><code># 문제 데이터 : studytime
# 정답 데이터 : G3
X = data[&#39;studytime&#39;]
X.shape         #  문제데이터는 무조건 2차원이여야 함

X = data[[&#39;studytime&#39;]]
X.shape

y = data[&#39;G3&#39;]
y.shape</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/8ab92b9d-e997-4565-b0f1-6ec679bb652c/image.png" alt=""></p>
<pre><code># train_test_split
from sklearn.model_selection import train_test_split</code></pre><pre><code>X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3, random_state=5)</code></pre><pre><code># 머신러닝 모델로 수학점수 예측(회귀)
from sklearn.linear_model import LinearRegression</code></pre><pre><code># 객체 생성
linear_model = LinearRegression()</code></pre><pre><code># 학습
linear_model.fit(X_train,y_train)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/a5c16ce7-1473-485d-8aa5-16ed379727ab/image.png" alt=""></p>
<pre><code>linear_model.score(X_test,y_test)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/86428c7f-427c-4a2f-ba79-49b632e9518a/image.png" alt=""></p>
<p>학습 시킨후 정답값이 이상함..
내일까지 알아오기 숙제임</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[이미지 블렌딩 게임 제작]]></title>
            <link>https://velog.io/@sh_-s2/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B8%94%EB%A0%8C%EB%94%A9-%EA%B2%8C%EC%9E%84-%EC%A0%9C%EC%9E%91</link>
            <guid>https://velog.io/@sh_-s2/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B8%94%EB%A0%8C%EB%94%A9-%EA%B2%8C%EC%9E%84-%EC%A0%9C%EC%9E%91</guid>
            <pubDate>Wed, 25 Jun 2025 08:53:59 GMT</pubDate>
            <description><![CDATA[<h1 id="directory-접근하기">Directory 접근하기</h1>
<ul>
<li>os모듈 이용</li>
</ul>
<pre><code>img_fd = os.listdir(&quot;./data/crawlingDB&quot;)
img_fd</code></pre><blockquote>
<p>listdir : 폴더안에 들어있는 파일의 목록을 리스트 형태로 보여주는 함수
<img src="https://velog.velcdn.com/images/sh_-s2/post/e9b5a6dd-6e8d-4e5b-9690-2b234605d5ab/image.png" alt=""></p>
</blockquote>
<blockquote>
<h3 id="이미지-출력해보기">이미지 출력해보기</h3>
</blockquote>
<pre><code>img = cv2.imread(&quot;./data/crawlingDB/jenny.jfif&quot;)
-&gt; bgr 방식
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
-&gt; plt가 인식할 수 있게 rgb로 변환
plt.imshow(img)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/4d94ddff-9565-412e-b4d3-cc6ec1514b40/image.png" alt=""></p>
<p>-여기까지.. 나머지는 내일 이어서</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenCV 기초 이미지처리]]></title>
            <link>https://velog.io/@sh_-s2/OpenCV-%EA%B8%B0%EC%B4%88-%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@sh_-s2/OpenCV-%EA%B8%B0%EC%B4%88-%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Wed, 25 Jun 2025 08:49:39 GMT</pubDate>
            <description><![CDATA[<pre><code>import cv2</code></pre><pre><code>img =cv2.imread(&#39;./data/pets.jpg&#39;)
cv2.imshow(&#39;pets&#39;,img)
cv2.waitKey(0)
cv2.destroyAllWindows()</code></pre><blockquote>
<p>cv2.imshow(&#39;pets&#39;,img) -&gt;  윈도우 창을 띄워서 이미지를 보여주는 것이 기본
cv2.waitKey(0)  -&gt; 0 : 무한대기, ms단위로 대기 시간 설정
cv2.destroyAllWindows()  -&gt; 키가 입력되면 모든 윈도우 창 닫기</p>
</blockquote>
<blockquote>
<h3 id="cv2-자체가-가지고-있는-이미지-출력기능">cv2 자체가 가지고 있는 이미지 출력기능</h3>
<h4 id="imread경로-읽어내는-방식">imread(경로, 읽어내는 방식)</h4>
</blockquote>
<pre><code>img_color = cv2.imread(&#39;./data/pets.jpg&#39;, cv2.IMREAD_COLOR)
img_gray = cv2.imread(&#39;./data/pets.jpg&#39;, cv2.IMREAD_GRAYSCALE)
img_unchaged = cv2.imread(&#39;./data/pets.jpg&#39;, cv2.IMREAD_UNCHANGED)</code></pre><blockquote>
<h4 id="이미지-출력">이미지 출력</h4>
</blockquote>
<pre><code>cv2.imshow(&quot;color&quot;, img_color)
cv2.imshow(&quot;gray&quot;, img_gray)
cv2.imshow(&quot;unchaged&quot;, img_unchaged)
cv2.waitKey(0)  
cv2.destroyAllWindows()</code></pre><blockquote>
<p>cv2.waitKey(0) -&gt; 0 : 무한대기, ms단위로 대기 시간 설정
cv2.destroyAllWindows() -&gt; 키가 입력되면 모든 윈도우 창 닫기</p>
</blockquote>
<blockquote>
<h3 id="이미지-크기모양확인">이미지 크기(모양)확인</h3>
<p>print(&quot;color : &quot;, img_color.shape)
print(&quot;gray : &quot;, img_gray.shape)
print(&quot;unchaged : &quot;, img_unchaged.shape)
출력 값:
color :  (427, 640, 3)
gray :  (427, 640)
unchaged :  (427, 640, 3)</p>
</blockquote>
<h3 id="matplotlib에서-이미지-출력">matplotlib에서 이미지 출력</h3>
<pre><code>import cv2
import matplotlib.pyplot as plt</code></pre><blockquote>
<h3 id="1-이미지-경로-불러오기">1. 이미지 경로 불러오기</h3>
</blockquote>
<pre><code>img = cv2.imread(&#39;./data/pets.jpg&#39;, cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/a2ea7437-7aa9-4fe6-bdd7-8dbdbe13e988/image.png" alt=""></p>
<h3 id="이진-이미지-구성이미지-이진화">이진 이미지 구성(이미지 이진화)</h3>
<ul>
<li>0,1(255) 데이터 구성하기</li>
</ul>
<blockquote>
<h3 id="흑백이미지로-읽어내보기">흑백이미지로 읽어내보기</h3>
</blockquote>
<pre><code>img = cv2.imread(&#39;./data/pets.jpg&#39;, cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img, cmap=&#39;gray&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/8cca151f-4fe9-4aed-96ac-c0d2b221dbe6/image.png" alt=""></p>
<blockquote>
<h3 id="이미지-이진화">이미지 이진화</h3>
<p>img = cv2.imread(&#39;./data/ryan.jpg&#39;, cv2.IMREAD_GRAYSCALE)</p>
</blockquote>
<blockquote>
<h3 id="이진화---cv2threshold대상-임계값기준값-값-이진화-종류처리방식">이진화 -&gt; cv2.threshold(대상, 임계값(기준값), 값, 이진화 종류(처리방식))</h3>
</blockquote>
<pre><code>_,img_thr = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)</code></pre><blockquote>
<h3 id="pltsubplot행-열-순서">plt.subplot(행, 열, 순서)</h3>
</blockquote>
<pre><code>plt.subplot(1,3,1)
plt.axis(&#39;off&#39;)     # 축 표시 안되게 설정
plt.imshow(img, cmap=&#39;gray&#39;)
plt.subplot(1,3,2)
plt.imshow(img_thr, cmap=&#39;gray&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/57310471-ab2c-4d17-9b1f-8199f7a86093/image.png" alt=""></p>
<blockquote>
<ul>
<li>자동으로 임계값을 찾아주는 기능 적용하기 : Otsu(오츠)의 이진화</li>
</ul>
</blockquote>
<blockquote>
<h3 id="이미지-이진화-1">이미지 이진화</h3>
</blockquote>
<pre><code>img = cv2.imread(&#39;./data/ryan.jpg&#39;, cv2.IMREAD_GRAYSCALE)</code></pre><blockquote>
<h3 id="이진화---cv2threshold대상-임계값기준값-값-이진화-종류처리방식-1">이진화 -&gt; cv2.threshold(대상, 임계값(기준값), 값, 이진화 종류(처리방식))</h3>
</blockquote>
<pre><code>_,img_thr = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)     # gray scale이 100이상인 것은 흰색(255)으로
th_val,img_thr2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)     # 자동으로 최적 임계값을 선택하는 알고리즘</code></pre><blockquote>
<h3 id="pltsubplot행-열-순서-1">plt.subplot(행, 열, 순서)</h3>
</blockquote>
<pre><code>plt.subplot(1,3,1)
plt.title(f&#39;original&#39;)
plt.axis(&#39;off&#39;)     # 축 표시 안되게 설정
plt.imshow(img, cmap=&#39;gray&#39;)</code></pre><pre><code>plt.subplot(1,3,2)
plt.title(f&#39;thres: 100&#39;)
plt.axis(&#39;off&#39;)     
plt.imshow(img_thr, cmap=&#39;gray&#39;)</code></pre><pre><code>plt.subplot(1,3,3)
plt.title(f&#39;otsu:{th_val}&#39;)
plt.axis(&#39;off&#39;)     
plt.imshow(img_thr2, cmap=&#39;gray&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/ea9b351e-e0ca-439a-9da8-2d5fc52a4be9/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Numpy 선행학습]]></title>
            <link>https://velog.io/@sh_-s2/Numpy-%EC%84%A0%ED%96%89%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@sh_-s2/Numpy-%EC%84%A0%ED%96%89%ED%95%99%EC%8A%B5</guid>
            <pubDate>Wed, 25 Jun 2025 04:06:09 GMT</pubDate>
            <description><![CDATA[<pre><code>import numpy as np</code></pre><blockquote>
<p>numpy 데이터형태 종류
<img src="https://velog.velcdn.com/images/sh_-s2/post/aa965dd6-2fe8-47ea-8d0f-cae125bbea7a/image.png" alt=""></p>
</blockquote>
<blockquote>
<h2 id="numpy-제공-데이터-타입-이해하기">numpy 제공 데이터 타입 이해하기</h2>
</blockquote>
<ul>
<li>파이썬 기본 제공 데이터타입 : int, float, string, bool - 단수 // list, tuple, dic, set - 복수</li>
<li>numpy : ndarray(다차원배열)</li>
<li>기존 파이썬이 가질 수 있는 데이터 처리 크기보다 더 큰 데이터를 정리 할 수 있는 자료구조</li>
</ul>
<blockquote>
<h2 id="numpy-배열의-특징">numpy 배열의 특징</h2>
</blockquote>
<ul>
<li>동일한 자료형을 가지는 값들이 배열 형태로 존재</li>
<li>n차원 형태로 구성 가능</li>
<li>data에 접근하기 위한 index(색인) 존재</li>
</ul>
<blockquote>
<h3 id="numpy-배열-다루기">numpy 배열 다루기</h3>
</blockquote>
<ul>
<li>1차원 배열 생성</li>
</ul>
<pre><code>np.array([1, 2, 3, 4, 5])</code></pre><p>출력값 : array([1,2,3,4,5])</p>
<pre><code>list = [1, 2, 3, 4, 5]
arr1 = np.array(list)
arr1</code></pre><p>출력값 : array([1,2,3,4,5])</p>
<p>리스트에 값을 넣어서 출력할수있음</p>
<blockquote>
<p>list + 1  &gt;&gt;  오류
arr1 + 1  &gt;&gt;  가능</p>
</blockquote>
<pre><code>arr2 = np.array([[1, 2, 3, 4, 5],[5, 6, 7, 8, 9]])
arr2</code></pre><p>출력값 : array([[1, 2, 3, 4, 5],
                  [5, 6, 7, 8, 9]])</p>
<p>줄바꿈 형태로 출력됨</p>
<blockquote>
<h3 id="2차원-배열의-정보-출력하기">2차원 배열의 정보 출력하기</h3>
</blockquote>
<pre><code>print(&quot;배열의 크기(행,열) : &quot;,arr2.shape)
print(&quot;배열의 요소 갯수 : &quot;,arr2.size)
print(&quot;배열의 차원 수 : &quot;,arr2.ndim)
print(&quot;배열의 데이터 타입 : &quot;,arr2.dtype)</code></pre><p>출력값 :
배열의 크기(행,열) :  (2, 5)
배열의 요소 갯수 :  10
배열의 차원 수 :  2
배열의 데이터 타입 :  int32</p>
<blockquote>
<h4 id="배열을-생성하는-다양한-함수들">배열을 생성하는 다양한 함수들</h4>
<p>1 ~ 50 들어있는 1차원 배열 생성</p>
</blockquote>
<pre><code>arr3 = np.arange(1, 51, 1)
arr3</code></pre><p>출력값 : </p>
<pre><code>array([ 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, 49, 50])</code></pre><blockquote>
<h3 id="arr3--2차원5행10열-변환">arr3 &gt; 2차원(5행10열) 변환</h3>
</blockquote>
<pre><code>arr3.reshape(5,10)</code></pre><p>출력값 :</p>
<pre><code>array([[ 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, 49, 50]])</code></pre><blockquote>
<h3 id="실습-이미지-데이터-불러와서-정보-확인하기">실습) 이미지 데이터 불러와서 정보 확인하기</h3>
</blockquote>
<ul>
<li>openCV 라이브러리 활용하기</li>
</ul>
<pre><code>!pip install opencv-python
</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/e22bc65c-d6a4-4ef6-bd2e-e8aadc3fad06/image.png" alt=""></p>
<pre><code>import cv2
import matplotlib.pyplot as plt</code></pre><blockquote>
<h3 id="1-이미지-경로-불러오기">1. 이미지 경로 불러오기</h3>
</blockquote>
<pre><code>img = cv2.imread(&#39;./data/jang.jpg&#39;, cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/dd9d436d-4be5-4e1a-938e-eb34ab676db9/image.png" alt=""></p>
<pre><code>img.ndim</code></pre><blockquote>
<h4 id="행-열-채널rgb">행, 열, 채널(RGB)</h4>
</blockquote>
<pre><code>img.shape</code></pre><blockquote>
<h4 id="흰색의-경우-255-255-255r-g-b">흰색의 경우 (255, 255, 255)r g b</h4>
</blockquote>
<pre><code>img</code></pre><p>출력값 :</p>
<pre><code>array([[[235, 232, 241],
        [235, 232, 241],
        [235, 232, 241],
        ...,
        [236, 233, 240],
        [236, 233, 240],
        [236, 233, 240]],

       [[235, 232, 241],
        [235, 232, 241],
        [235, 232, 241],
        ...,
        [236, 233, 240],
        [236, 233, 240],
        [236, 233, 240]],

       [[235, 232, 241],
        [235, 232, 241],
        [235, 232, 241],
        ...,
        [236, 233, 240],
        [236, 233, 240],
        [236, 233, 240]],

       ...,
...
        [ 32,  28,  55],
        ...,
        [253, 242, 236],
        [253, 242, 236],
        [249, 240, 233]]], dtype=uint8)</code></pre><pre><code>회색톤 이미지로 변환
img = cv2.imread(&#39;./data/jang.jpg&#39;, cv2.IMREAD_COLOR)

기본적으로 컴퓨터 기본 3원색은 rgb  but, cv2의 경우 bgr
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

bgr &gt; gray 변경
plt.imshow(img, cmap=&#39;gray&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/7f3a2482-31e6-4965-bb56-c287e6e495ca/image.png" alt=""></p>
<blockquote>
<h4 id="gray-처리를-해-흑백-뿐이니-2차원">gray 처리를 해 흑백 뿐이니 2차원</h4>
</blockquote>
<pre><code>img.ndim</code></pre><blockquote>
<h3 id="numpy-데이터-접근">Numpy 데이터 접근</h3>
</blockquote>
<ul>
<li>indexing ; slicing 이용하여 인덱스 기반 접근</li>
<li>boolean indexing : 논리연산자 이용 Ture 위치 데이터에 접근 가능</li>
</ul>
<blockquote>
<h3 id="arr4-10-20-30-40-50-60-만들기">arr4 10, 20, 30 40, 50, 60 만들기</h3>
</blockquote>
<pre><code>arr4 = np.arange(10, 61, 10)
arr4</code></pre><blockquote>
<h3 id="arr4에-있는-40에-접근">arr4에 있는 40에 접근</h3>
</blockquote>
<pre><code>arr4[3]</code></pre><blockquote>
<h3 id="arr4에-있는-40-60에-접근">arr4에 있는 40, 60에 접근</h3>
</blockquote>
<pre><code>arr4[3],arr4[5]
arr4[[3, 5]]       &lt;- 파이썬에서는 여러 개를 동시에 입력 할 때 포장(packing)
arr4[3,5]         &lt;- 이렇게 작성하면 컴마 앞은 행, 컴마 뒤는 열이라 인식 오류뜸</code></pre><blockquote>
<h3 id="10--30-슬라이싱">10 ~ 30 슬라이싱</h3>
</blockquote>
<pre><code>arr4[:3]</code></pre><p>출력값 : array([10, 20, 30])</p>
<blockquote>
<h3 id="10-30-50-출력-slicing-이용">10 30 50 출력 (slicing 이용)</h3>
</blockquote>
<pre><code>arr4[0::2]      # [시작 인덱스 넘버 : 끝 인덱스 넘버 : 증가량]</code></pre><p>출력값 array([10, 30, 50])</p>
<blockquote>
<h3 id="2행-3열">2행 3열</h3>
</blockquote>
<pre><code>arr4 = arr4.reshape(2,3) 
arr4</code></pre><p>출력값 :
array([[10, 20, 30],
       [40, 50, 60]])</p>
<blockquote>
<h3 id="20에-접근">20에 접근</h3>
</blockquote>
<pre><code>arr4[0,1]       # 이것만 기억</code></pre><blockquote>
<h3 id="50-60-출력">50, 60 출력</h3>
</blockquote>
<pre><code>arr4[1,1:]</code></pre><p>출력값 : array([50, 60])</p>
<blockquote>
<h3 id="1부터-50까지-들어있는-배열--5행-10열">1부터 50까지 들어있는 배열  (5행 10열)</h3>
</blockquote>
<pre><code>arr5 = np.arange(1, 51, 1).reshape(5,10)
arr5</code></pre><p>출력값 :</p>
<pre><code>array([[ 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, 49, 50]])</code></pre><blockquote>
<p>##실습
<img src="https://velog.velcdn.com/images/sh_-s2/post/e9448361-9db7-49f8-ba50-40e83fd1327f/image.png" alt=""></p>
</blockquote>
<pre><code>arr5[ : , [0, 3, 6, 9]]

출력값 :
array([[ 1,  4,  7, 10],
       [11, 14, 17, 20],
       [21, 24, 27, 30],
       [31, 34, 37, 40],
       [41, 44, 47, 50]])</code></pre><pre><code>arr5[ : , : : 3]

출력값 :
array([[ 1,  4,  7, 10],
       [11, 14, 17, 20],
       [21, 24, 27, 30],
       [31, 34, 37, 40],
       [41, 44, 47, 50]])</code></pre><blockquote>
<ul>
<li>조건에 맞는 데이터 접근하기(불리언 인덱싱)</li>
</ul>
</blockquote>
<blockquote>
<h3 id="참-거짓이-랜덤하게-10개의-데이터가-들어있는-배열">참 거짓이 랜덤하게 10개의 데이터가 들어있는 배열</h3>
</blockquote>
<pre><code>np.random.seed(1)       # 난수 생성기의 초기값(seed) 설정 &gt; 재현성 확보
bool_arr = np.random.choice([True, False], size = 10)
temp_arr = np.arange(10)
bool_arr</code></pre><pre><code>출력값 :
array([False, False,  True,  True, False, False, False, False, False,
        True])</code></pre><pre><code>temp_arr[bool_arr]

출력값 :
array([2, 3, 9])</code></pre><blockquote>
<h3 id="40--100-사이-랜덤-정수-10개">40 ~ 100 사이 랜덤 정수 10개</h3>
</blockquote>
<pre><code>np.random.seed(18)       # 난수 생성기의 초기값(seed) 설정 &gt; 재현성 확보
score_arr = np.random.randint(40, 100, size = 10)
# 번호 생성
num_arr = np.arange(1,11)
score_arr</code></pre><pre><code>출력값 :
array([82, 59, 96, 45, 89, 86, 90, 42, 48, 64])</code></pre><blockquote>
<h3 id="75이상의-수-위치-넘버-확인">75이상의 수 위치 넘버 확인</h3>
</blockquote>
<pre><code>num_arr[score_arr &gt;= 75]

출력값 :
array([1, 3, 5, 6, 7])</code></pre><blockquote>
<h3 id="이미지의-얼굴에-접근-하기------use">이미지의 얼굴에 접근 하기   &gt;   use</h3>
</blockquote>
<pre><code>slicing
plt.imshow(img, cmap=&#39;gray&#39;)
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/06f6c250-70cf-4857-907b-d56e86f9a610/image.png" alt=""></p>
<blockquote>
<h3 id="이미지의-얼굴에-접근-하기------use-1">이미지의 얼굴에 접근 하기   &gt;   use</h3>
</blockquote>
<pre><code>slicing
plt.imshow(img[200:600, 180:600], cmap=&#39;gray&#39;)
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/ee04214f-8e74-4ac3-aeb4-13073a79cca1/image.png" alt=""></p>
<blockquote>
<h3 id="이미지의-얼굴에-접근-하기------use-2">이미지의 얼굴에 접근 하기   &gt;   use</h3>
</blockquote>
<pre><code>slicing
plt.imshow(img[60:650, 100:640], cmap=&#39;gray&#39;)
plt.show()</code></pre><p><img src="https://velog.velcdn.com/images/sh_-s2/post/e1f5a25b-c238-43e1-97a8-12aa11f09427/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[선형 회귀(Linear Regression)]]></title>
            <link>https://velog.io/@sh_-s2/%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80Linear-Regression</link>
            <guid>https://velog.io/@sh_-s2/%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80Linear-Regression</guid>
            <pubDate>Tue, 24 Jun 2025 05:28:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sh_-s2/post/d347d505-37d4-46fd-ad5d-eaf3ebba88de/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/5744d6df-f198-4496-a92f-b296f645c9b9/image.png" alt=""></p>
<p>예측 하는 선 으로 돌아가는게 회귀</p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/6a10ca0c-ba17-440c-8db3-1f586b007d2b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/85a04703-588d-47be-9108-4b42390d307f/image.png" alt=""></p>
<h2 id="학습-목표">학습 목표</h2>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/66f0eb3d-5269-4879-a010-ad75478b4299/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/27b9cba8-4bc3-46db-92a1-c814161c2b82/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/423b39f9-b28e-459b-9ae8-9a5724d9ef40/image.png" alt=""></p>
<p>연결하는 선 = &gt; 예측선</p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/912640d4-c485-4176-aef8-7688791f2d1b/image.png" alt=""></p>
<p>그래프를 보니 7 시간 공부한 살마은 70점을 맞을거라는걸 예측 할 수 있음</p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/ba783521-dbe6-4467-8c91-c7ea5162e6bd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/ef680400-3cd0-45e9-9659-04e656b5ac6d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/ad747522-b00e-454a-8631-e9a79537d046/image.png" alt=""></p>
<p>오차값 =&gt; 실제값과 예측값의 차이</p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/c2e2bdb1-e26f-4c9c-93ce-424187b48ba4/image.png" alt=""></p>
<p>손실 함수 구하기</p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/1db9cd27-a2aa-4ec3-8450-75bac95c382c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/8ebeab17-439c-4d7c-be80-717d6bef54db/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/5802b7ff-0809-42f0-a07c-07368118d5cb/image.png" alt=""></p>
<p>MSE = </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP/Spring]]></title>
            <link>https://velog.io/@sh_-s2/JSPSpring-5zn3dzcq</link>
            <guid>https://velog.io/@sh_-s2/JSPSpring-5zn3dzcq</guid>
            <pubDate>Tue, 20 May 2025 01:18:34 GMT</pubDate>
            <description><![CDATA[<h3 id="ex08-실습">Ex08 실습</h3>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/a6604f7b-e98f-49c4-9c48-36df5501b1da/image.png" alt=""></p>
<p>오늘은 이걸 만들어 볼꺼임
아이디 비밀번호를 맞게 입력하면 메인페이지로 가고 로그아웃 까지 할수있는 근데 회원인증 실패하면 다시 처음부터 해야하는 실습을 할꺼임
일단 파일들 부터 만들고 시작합시다.</p>
<p>Ex08LoginForm.jsp
Ex08Logout.jsp
Ex08LoginCheck.jsp
Ex08Main.jsp
4가지 파일을 모두 만들었으면</p>
<h4 id="loginformjsp">LoginForm.jsp</h4>
<p>1) 프롬태그 넣어서 연결해주고 메소드에 POST방식</p>
<ul>
<li>바디태그 안에<pre><code>form(action=&quot;Ex08LoginCheck.jsp&quot; method=&quot;post&quot;&gt;</code></pre></li>
<li>(Ex08LoginCheck.jsp)에 ctrl + 마우스 좌클릭하면 해당 페이지로 넘어가 </li>
</ul>
<p>2) 아이디 비번 값 주고</p>
<pre><code>ID : &lt;input type=&quot;text&quot; name=&quot;id&quot;&gt;&lt;br&gt;
PW : &lt;input type=&quot;text&quot; name=&quot;pw&quot;&gt;&lt;br&gt;</code></pre><p>3) 인풋테그 추가해서 타입에 submit  벨류에 로그인 넣기.</p>
<pre><code>&lt;input type=&quot;submit&quot; value=&quot;LOGIN&quot;&gt;&lt;br&gt;</code></pre><p>전체 코드</p>
<pre><code>&lt;form action=&quot;Ex08LoginCheck.jsp&quot; method=&quot;post&quot;&gt;
        ID : &lt;input type=&quot;text&quot; name=&quot;id&quot;&gt;&lt;br&gt;
        PW : &lt;input type=&quot;text&quot; name=&quot;pw&quot;&gt;&lt;br&gt;
        &lt;input type=&quot;submit&quot; value=&quot;LOGIN&quot;&gt;&lt;br&gt;
&lt;/form&gt;</code></pre><p>이렇게 하면됨</p>
<h4 id="logincheckjsp">loginCheck.jsp</h4>
<p>1) 스트링 id,pw 넣어주기</p>
<pre><code>String id = request.getParameter(&quot;id&quot;);
String pw = request.getParameter(&quot;pw&quot;);</code></pre><p>2) 로그인 성공 실패 넣어줘야지!</p>
<ul>
<li>if 문써서 넣어주고</li>
<li>성공하면 메인으로 실패하면 다시 LoginForm으로 돌아가게 설정해주면됨<pre><code>if(id.equals(&quot;test&quot;) &amp;&amp; pw.equals(&quot;12345&quot;)){
  // 로그인 성공
  session.setAttribute(&quot;nick&quot;, &quot;화요일싫어금요일좋아&quot;);
  response.sendRedirect(&quot;Ex08Main.jsp&quot;);
}else{
  // 로그인 실패
  response.sendRedirect(&quot;Ex08LoginForm.jsp&quot;);
}</code></pre></li>
</ul>
<p>전체 코드</p>
<pre><code>&lt;%
    String id = request.getParameter(&quot;id&quot;);
    String pw = request.getParameter(&quot;pw&quot;);

    if(id.equals(&quot;test&quot;) &amp;&amp; pw.equals(&quot;12345&quot;)){
        // 로그인 성공
        session.setAttribute(&quot;nick&quot;, &quot;화요일싫어금요일좋아&quot;);
        response.sendRedirect(&quot;Ex08Main.jsp&quot;);
    }else{
        // 로그인 실패
        response.sendRedirect(&quot;Ex08LoginForm.jsp&quot;);
    }
%&gt;</code></pre><h4 id="mainjsp">Main.jsp</h4>
<p>1)환영합니다 라는 문구랑 로그아웃을 넣어주면됨</p>
<pre><code>&lt;%=session.getAttribute(&quot;nick&quot;) %&gt;님 환영합니다~!
&lt;a href=&quot;Ex08Logout.jsp&quot;&gt;로그아웃&lt;/a&gt;</code></pre><h4 id="logoutjsp">Logout.jsp</h4>
<p>로그아웃됬다는 팝업창이랑 페이지 이동만 하면됨</p>
<pre><code>&lt;%
    session.invalidate();
%&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    alert(&quot;안전하게 로그아웃 되었습니다.&quot;);
    location.href=&quot;Ex08LoginForm.jsp&quot;;


&lt;/script&gt;</code></pre><p>이러면 끝이야</p>
<p>실행해보면 아이디비번 입력하고 맞으면 메인페이지로가서 닉네임 뜨고 로그아웃 할수있고 다시 첫 페이지로 돌아가 아이디 비번이 다르면 다시 첫페이지로 돌아가 완벽해</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP/Spring 세션]]></title>
            <link>https://velog.io/@sh_-s2/JSPSpring-%EC%84%B8%EC%85%98</link>
            <guid>https://velog.io/@sh_-s2/JSPSpring-%EC%84%B8%EC%85%98</guid>
            <pubDate>Mon, 19 May 2025 08:10:26 GMT</pubDate>
            <description><![CDATA[<p>오늘은 세션에 대해 알아보겠습니다.</p>
<p>자 일단 파일부터 만들고 시작하겠습니다.</p>
<h4 id="ex04createsession">Ex04CreateSession</h4>
<p>1) 세션 값 설정!</p>
<pre><code>session.setAttribute(&quot;id&quot;, &quot;sanhae&quot;);
session.setAttribute(&quot;age&quot;, 20);</code></pre><ul>
<li>id 다음 &quot;sanhae&quot;는 본인 이 원하시는대로 수정하면 됩니다</li>
</ul>
<p>2) 세션 확인 (연결하기)</p>
<ul>
<li>이제 연결해줘야죠!<pre><code>&lt;a href=&quot;Ex05GetSession.jsp&quot;&gt;세션확인&lt;/a&gt;</code></pre></li>
</ul>
<p>전체 코드는</p>
<pre><code>&lt;%
    session.setAttribute(&quot;id&quot;, &quot;sanhae&quot;);
    session.setAttribute(&quot;age&quot;, 20);
%&gt;

&lt;a href=&quot;Ex05GetSession.jsp&quot;&gt;세션확인&lt;/a&gt;</code></pre><h4 id="ex05getsessionjsp">Ex05GetSession.jsp</h4>
<p>위에 Ex05GetSession.jsp로 연결했으니 다시 해당이름 복사해서 파일 만들어주고</p>
<p>1) &lt;% %&gt; 해당 기호를 사용해서</p>
<pre><code>&lt;%
        String id = (String)session.getAttribute(&quot;id&quot;);
        int age = (int)session.getAttribute(&quot;age&quot;);
%&gt;</code></pre><p>2) 아이디, 나이 세션, 세션 아이디, 기본 세션 유효시간을 넣기</p>
<pre><code>아이디 : &lt;%=id %&gt; &lt;br&gt;
나이 : &lt;%=age %&gt; &lt;br&gt;
세션 아이디 : &lt;%=session.getId() %&gt;&lt;br&gt;
기본 세션 유효시간 : &lt;%=session.getMaxInactiveInterval() %&gt;
&lt;br&gt;</code></pre><p>3) 세션을 만들었으면 삭제도 해야지 ! 연결합시다!</p>
<pre><code>&lt;a href=&quot;Ex06RemoveSession.jsp&quot;&gt;세션삭제&lt;/a&gt;</code></pre><p>전체 코드</p>
<pre><code>&lt;%
    String id = (String)session.getAttribute(&quot;id&quot;);
    int age = (int)session.getAttribute(&quot;age&quot;);
%&gt;

아이디 : &lt;%=id %&gt; &lt;br&gt;
나이 : &lt;%=age %&gt; &lt;br&gt;
세션 아이디 : &lt;%=session.getId() %&gt;&lt;br&gt;
기본 세션 유효시간 : &lt;%=session.getMaxInactiveInterval() %&gt;
&lt;br&gt;</code></pre><h4 id="ex06removesessionjsp">Ex06RemoveSession.jsp</h4>
<p>1) 아이디 값 입력해주고 연결 까지!</p>
<pre><code>&lt;%
    session.removeAttribute(&quot;id&quot;);
%&gt;

&lt;a href=&quot;Ex05GetSession.jsp&quot;&gt;세션확인&lt;/a&gt;</code></pre><h4 id="ex07invalidatesessionjsp">Ex07InvalidateSession.jsp</h4>
<p>1) 세션 값 전체 삭제</p>
<pre><code>&lt;%
    session.invalidate();
%&gt;

&lt;a href=&quot;Ex05GetSession.jsp&quot;&gt;세션확인&lt;/a&gt;</code></pre><h4 id="ex05getsessionjsp-1">Ex05GetSession.jsp</h4>
<p>1) 다시 돌아와서 전체삭제 연결해줘야해</p>
<pre><code>&lt;a href=&quot;Ex06RemoveSession.jsp&quot;&gt;세션전체삭제&lt;/a&gt;
&lt;a href=&quot;Ex07InvalidateSession.jsp&quot;&gt;세션전체삭제&lt;/a&gt;</code></pre><p>자 이러면 끝. 코드 정리해볼까</p>
<p>Ex05 전체 코드(전체 삭제 추가한것)</p>
<pre><code>&lt;%
    String id = (String)session.getAttribute(&quot;id&quot;);
    int age = (int)session.getAttribute(&quot;age&quot;);
%&gt;

아이디 : &lt;%=id %&gt; &lt;br&gt;
나이 : &lt;%=age %&gt; &lt;br&gt;
세션 아이디 : &lt;%=session.getId() %&gt;&lt;br&gt;
기본 세션 유효시간 : &lt;%=session.getMaxInactiveInterval() %&gt;
&lt;br&gt;

&lt;a href=&quot;Ex06RemoveSession.jsp&quot;&gt;세션전체삭제&lt;/a&gt;
&lt;a href=&quot;Ex07InvalidateSession.jsp&quot;&gt;세션전체삭제&lt;/a&gt;</code></pre><p>이러면 끝. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JSP/Spring]]></title>
            <link>https://velog.io/@sh_-s2/JSPSpring</link>
            <guid>https://velog.io/@sh_-s2/JSPSpring</guid>
            <pubDate>Mon, 19 May 2025 07:29:09 GMT</pubDate>
            <description><![CDATA[<p>이번엔 쿠키를 생성하고 삭제 해보겠음</p>
<h4 id="ex01createcookiejsp">Ex01CreateCookie.jsp</h4>
<p>첫번째로 JSP 파일 생성</p>
<ul>
<li>Ex01CreateCookie.jsp
파일을 생성 한 후. 
1) 쿠키 객체 생성</li>
<li>Cookie(name(String), value(String))<pre><code>Cookie cookie = new Cookie(&quot;test&quot;, &quot;cookie&quot;</code></pre>2) 유효기간 설정(초단위)<pre><code>cookie.setMaxAge(60*60*24*365);</code></pre>3) 클라이언트(브라우저)에게 쿠키 전송(서버 -&gt; 클라이언트)<pre><code>response.addCookie(cookie);</code></pre>4) 유효기간을 설정하지 않고 쿠키를 보내는 경우<pre><code>response.addCookie(new Cookie(&quot;name&quot;, &quot;sanhae&quot;));</code></pre></li>
<li>여기서 name 다음에 오는 sanhae는 본인이 원하는 대로 수정하시면됩니다</li>
</ul>
<p>5) 쿠키확인</p>
<pre><code>&lt;a href=&quot;Ex02getCookie.jsp&quot;&gt;쿠키확인&lt;/a&gt;</code></pre><p> 전체 코드를 정리하면</p>
<pre><code>&lt;%
    Cookie cookie =  new Cookie(&quot;test&quot;, &quot;cookie&quot;);
    cookie.setMaxAge(60*60*24*365);
    response.addCookie(cookie);
    response.addCookie(new Cookie(&quot;name&quot;, &quot;sanhae&quot;));
%&gt;

&lt;a href=&quot;Ex02GetCookie.jsp&quot;&gt;쿠키확인&lt;/a&gt;</code></pre><p>이제 Ex02 파일로 경로를 설정했으니 넘어가서~</p>
<h4 id="ex02getcookiejsp">Ex02GetCookie.jsp</h4>
<p>1) 쿠키 객체 가져오기</p>
<pre><code>&lt;%
    Cookie[] cookies = request.getCookies();
    for(Cookie c : cookies){
        out.print(c.getName() + &quot;:&quot; + c.getValue() + &quot;&lt;br&gt;&quot;);
    }
%&gt;
&lt;a href=&quot;Ex03RemoveCookie.jsp&quot;&gt;쿠키삭제&lt;/a&gt;</code></pre><h4 id="ex03removecookiejsp">Ex03RemoveCookie.jsp</h4>
<p>1) 쿠키 객체 생성</p>
<pre><code>Cookie cookie = new Cookie(&quot;test&quot;, &quot;&quot;);</code></pre><ul>
<li>삭제시켜주는 메소드가 따로 없기 때문에 유효기간을 0으로 바꿔줘야 함</li>
</ul>
<p>2) 유효기간 0초</p>
<pre><code>cookie.setMaxAge(0);</code></pre><p>3) 클라이언트에게 쿠키 재전송</p>
<pre><code>response.addCookie(cookie);</code></pre><p>4) 쿠키 확인</p>
<pre><code>&lt;a href=&quot;Ex02GetCookie.jsp&quot;&gt;쿠키확인&lt;/a&gt;</code></pre><p>전체 코드</p>
<pre><code>&lt;%
    Cookie cookie = new Cookie(&quot;test&quot;, &quot;&quot;);
    cookie.setMaxAge(0);
    response.addCookie(cookie);
%&gt;
&lt;a href=&quot;Ex02GetCookie.jsp&quot;&gt;쿠키확인&lt;/a&gt;</code></pre><p>이렇게 하면 쿠키를 재생성 하고 삭제 해볼수 있습니다~
어렵다구요 저도 어려워요!
하나도 모르겠다구요? 저랑 똑같으시네요 모두 화이팅</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JavaScript]]></title>
            <link>https://velog.io/@sh_-s2/JavaScript-lkjbavnh</link>
            <guid>https://velog.io/@sh_-s2/JavaScript-lkjbavnh</guid>
            <pubDate>Thu, 08 May 2025 16:50:14 GMT</pubDate>
            <description><![CDATA[<p>Java Script 첫수업</p>
<h1 id="기초">기초</h1>
<p>자바스크립트 문법 작성법
body 태그 가장 하단에 작성
script 태그 안에 작성</p>
<p>예시</p>
<pre><code>&lt;body&gt;
    &lt;script&gt;
        들어갈 내용
    &lt;script&gt;
&lt;body&gt;</code></pre><h3 id="ex01">Ex01</h3>
<h4 id="1-출력">1. 출력</h4>
<p>1) 문서에 출력</p>
<ul>
<li>웹페이지 출력
document.write(&#39;문서에 출력!&#39;);</li>
</ul>
<p>2) consonle창 출력</p>
<ul>
<li>console.log(&#39;console에 출력!&#39;);</li>
<li>vs코드에서 log만 쳐도 앞에 console 나옴</li>
</ul>
<p>3) 팝업창에 출력</p>
<ul>
<li>alert(&#39;팝업창에 출력!&#39;);</li>
</ul>
<h5 id="2-입력">2. 입력</h5>
<p>1) 확인 질문 : confirm</p>
<ul>
<li>확인(true) or 취소(false)</li>
<li>리턴타입 : boolean
var late = confirm(&#39;오늘 지각 안했나요?&#39;);
conlsole.log(late);</li>
</ul>
<p>2) 입력 확인문 : prompt</p>
<ul>
<li>사용자가 입력 가능</li>
<li>리턴타입 : string</li>
<li>prompt(&#39;질문(필수)&#39;, 응답의 기본값(선택));
var menu = prompt(&#39;오늘 점심메뉴는 무엇인가요?&#39;, &#39;맛집&#39;);
console.log(menu);</li>
</ul>
<h3 id="ex02">EX02</h3>
<h4 id="1-변수">1. 변수</h4>
<p>변수란?</p>
<ul>
<li>데이터를 담는 공간</li>
</ul>
<p>호이스팅 현상</p>
<ul>
<li>&quot;변수가 선언되기 전에 사용하는걸 허용하는 특성&quot; 이라고 생각하면됨</li>
<li>let과 const는 더 엄격하게 동작해서, 선언 전에 사용하려면 에러가 발생</li>
</ul>
<p>1) var (요즘은 잘 안씀)</p>
<ul>
<li>코드가 실행되면 메모리에 변수, 함수를 미리 저장
var color = &#39;balck&#39;;    (선언)
var color = &#39;pink&#39;;    (재선언 가능)
color = &#39;yellow&#39;;        (재할당 가능)
console.log(&#39;var : &#39;, color);</li>
</ul>
<p>2) let (요즘은 var 말고 let을 씀)</p>
<ul>
<li>var 과 같이 코드가 실행되면 메모리에 변수, 함수를 미리 저장</li>
<li>var 과 다른점은 재선언이 불가능함.</li>
<li>재할당은 가능
let color = &#39;balck&#39;;    (선언)
let color = &#39;pink&#39;;        (재선언 불가능)
color = &#39;yellow&#39;;
console.log(&#39;let : &#39;, color);</li>
</ul>
<p>3) const : 상수</p>
<ul>
<li>변하면 안되는 값        ex) 주민등록번호, 여권번호, 혈액형 등</li>
<li>누군가 접근해서 재선언, 재할당 하면 안되는 값
const color = &#39;black&#39;;        (선언)
const color = &#39;pink&#39;;        (재선언 불가능)
color = &#39;yellow&#39;;            (재할당 불가능)
console.log(&#39;const : &#39;, color);        (선언)</li>
</ul>
<h3 id="ex-03">Ex 03</h3>
<h4 id="변수실습">변수실습!</h4>
<p>1) 사용자한테 이름을 입력받기 (prompt 사용)
2) console창에 출력 &#39; console.log(&#39;let : &#39;, name); &#39;</p>
<ul>
<li>어서오세요!</li>
<li>000님, 환영합니다!
3) 웹페이지에 출력 (document.write 사용)</li>
<li>안녕 000님 환영합니다!</li>
</ul>
<p>let name = prompt(&#39;너의 이름은?&#39;);
console.log(&#39;어서오세요!&#39;);
console.log(name, &#39;님, 환영합니다!&#39;);
document.write(&#39;안녕 &#39;,name,&#39;님 환영합니다!&#39;);</p>
<h4 id="tip-문자--변수-이어서-쓰는-방법">tip) 문자 + 변수 이어서 쓰는 방법</h4>
<p>1) 콤마( , )
2) 더하기( + )
3) 문자포매팅 백틱( ~ ) 쉬프트 안누르고 숫자 1번 왼쪽 버튼
document.write(백틱<br> 안녕 $ {name}님 환영합니다.백틱);</p>
<ul>
<li>백틱 쓰는법 : ${변수명}</li>
</ul>
<h3 id="ex-04">Ex 04</h3>
<h4 id="1-자료형">1. 자료형</h4>
<ul>
<li><p>Number : 정수, 실수 등 산술 연산이 가능한 자료형</p>
<blockquote>
<p>  let num1 = 1.234;
  let num2 = 5;
  console.log(&#39;num1 : &#39;, num1); =&gt; num1 : 1.234 출력됨
  console.log(&#39;num2 : &#39;, num2); =&gt; num2 : 5 출력됨</p>
</blockquote>
</li>
<li><p>String : 문자열로 이루어진 자료형</p>
<blockquote>
<p>  let str1 = &#39;안녕하세요?&#39;;
  let str2 = &#39;반갑습니다!&#39;;
  console.log(&#39;str1 : &#39;, str1); =&gt; 안녕하세요? 라고 출력됨
  console.log(&#39;str2 : &#39;, str2); =&gt; 반갑습니다! 라고 출력됨</p>
</blockquote>
</li>
<li><p>Boolean : 참/거짓으로 표현되는 논리 형태의 자료형</p>
<blockquote>
<p>  let eat = true;
  console.log(&#39;아침밥 먹었나요?&#39;, eat) =&gt; 아침밥 먹었나요? true 라고 출력됨</p>
</blockquote>
</li>
<li><p>undefined : 값이 할당된 적이 없거나 존재하지 않는 속성일 때의 유형</p>
<blockquote>
<p>  let value1;
  console.log(value1); =&gt; undefined 로 출력됨</p>
</blockquote>
</li>
<li><p>null : 아무런 값을 나타내지 않을 때의 자료형 의도적으로 비어있는 상태</p>
<blockquote>
<p>  let value2 = null;
  console.log(value2); =&gt; null 로 출력됨</p>
</blockquote>
</li>
</ul>
<h4 id="2-형변환">2. 형변환</h4>
<p>1) 문자를 숫자로 형변환 시킬수 있음</p>
<blockquote>
<p>  let number = &#39;3.14&#39;;
    console.log(number);</p>
</blockquote>
<ul>
<li><p>정수화 parseInt()</p>
<blockquote>
<p>  console.log(&#39;int : &#39;, parseInt(number));
  int : 3 으로 출력됨 (소숫점 사라짐)</p>
</blockquote>
</li>
<li><p>실수화 parseFloat</p>
<blockquote>
<p>  console.log(&#39;float : &#39;, parseFloat(number));
  float : 3.14 로 출력됨</p>
</blockquote>
</li>
<li><p>숫자화 Number()</p>
<blockquote>
<p>  console.log(&#39;number : &#39;, Number(number));
  number : 3.14 로 출력됨</p>
</blockquote>
</li>
</ul>
<p>2) 숫자를 문자로 형변환</p>
<blockquote>
<p>  let number2 = 100;
    console.log(number2);                ⇨ 100 으로 출력
    console.log(number2 + &#39;&#39;);            ⇨ 100 으로 출력
    console.log(number2+&#39;10&#39;);            ⇨ 10010 으로 출력
    console.log(String(number2));        ⇨ 문자 100 으로 출력
    console.log(number2.toString(2));    ⇨ 1100100 으로 출력 (2진법)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex07.titanic_생존사망예측 실습]]></title>
            <link>https://velog.io/@sh_-s2/Ex07.titanic%EC%83%9D%EC%A1%B4%EC%82%AC%EB%A7%9D%EC%98%88%EC%B8%A1-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@sh_-s2/Ex07.titanic%EC%83%9D%EC%A1%B4%EC%82%AC%EB%A7%9D%EC%98%88%EC%B8%A1-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Wed, 30 Apr 2025 08:50:54 GMT</pubDate>
            <description><![CDATA[<h1 id="목표">목표</h1>
<ul>
<li>타이타닉 데이터를 학습하고 생존자/사망자 예측을 해보자</li>
<li>머신러닝 전체 과정을 진행해보자</li>
</ul>
<h3 id="1-문제정의">1. 문제정의</h3>
<ul>
<li>생존/사망을 예측해보자</li>
</ul>
<h3 id="2-데이터-수집">2. 데이터 수집</h3>
<p>#사용할 라이브러리 불러오기
import numpy as np (다차원 배열(ndarray)과 벡터화 연산을 지원합니다.)
import pandas as pd (표 형태의 데이터를 다루는 데 특화된 라이브러리입니다.)
import matplotlib.pylab as plt (기본적인 그래프를 그릴 수 있는 시각화 라이브러리입니다.)
import seaborn as sns (Matplotlib 기반의 고급 시각화 라이브러리입니다.)</p>
<p>#사용할 데이터 파일 가져오기
train = pd.read_csv(&quot;./data/train.csv&quot;,index_col=&quot;PassengerId&quot;)   #index_col : 인덱스로 사용할 컬럼 지정
test = pd.read_csv(&quot;./data/test.csv&quot;,index_col=&quot;PassengerId&quot;)     </p>
<p>train
<img src="https://velog.velcdn.com/images/sh_-s2/post/f5c37bf9-15c9-4c99-9bf3-f323cd4ccc65/image.png" alt=""></p>
<p>#train test 크기 확인
train.shape , test.shape
#train에는 생존여부 컬럼이 추가되어 있음.</p>
<h3 id="3데이터-전처리">3.데이터 전처리</h3>
<p>#데이터 정보 확인해야함
train.info()  #정보 확인
<img src="https://velog.velcdn.com/images/sh_-s2/post/9ccbb879-f8fe-4df0-b298-ebfb87cd0759/image.png" alt=""></p>
<p>#결측치가 있는 컬럼 : Age, Cabin, Embarked
#데이터 타입 문자 -&gt; 수치형으로 변환 필요 -&gt; 인코딩(원핫, 레이블 인코딩)</p>
<p>#원핫 인코딩이란 범주형 데이터를 머신러닝 모델이 이해할 수 있도록 숫자로 바꾸는 방법 중 하나. 주어진 범주형 변수의 각 고유 값마다 하나의 컬럼을 만들어서, 해당 값에만 1을 주고 나머지는 0으로 채움.</p>
<p>test.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/7bc84217-b4f4-43c2-b481-a260decee16b/image.png" alt=""></p>
<p>#결측치 : age, Fare, Cabin
#Survived : 생존/사망 데이터가 없음 -&gt; 캐글이 알고 있다.</p>
<p>#캐글이란 데이터 과학과 머신러닝 관련 문제를 해결하는 온라인 플랫폼
<img src="https://velog.velcdn.com/images/sh_-s2/post/d4a5531c-aa82-4af8-860b-8da44db348e0/image.png" alt=""></p>
<h3 id="결측치-채우기">결측치 채우기</h3>
<ol>
<li>결측치가 있는 행 전체를 삭제하는 방법<ul>
<li>삭제하려는 데이터가 너무 많을때는 불가능, 모델링에 치명적이지 않은 데이터여야 가능</li>
</ul>
</li>
<li>결측치를 다른 값으로 대체하는 방법<ul>
<li>평균값, 최빈값, 중앙값 등이 있음</li>
</ul>
</li>
</ol>
<p>#결측치가 있는 컬럼 : Age, Cabin, Embarked
#train - Embarked 채우기
train[&#39;Embarked&#39;].describe()<br><img src="https://velog.velcdn.com/images/sh_-s2/post/829378ea-18f9-48a4-ad5b-0f8fcbb1664d/image.png" alt="">
#Embarked : 승객이 탑승한 항구(port)를 나타내는 컬럼</p>
<p>train[&#39;Embarked&#39;].value_counts()   #S가 가장 많이 탔다 !! - 최빈값으로 채워주자
<img src="https://velog.velcdn.com/images/sh_-s2/post/05b46faa-e06c-4e3f-b67f-306754a8bea3/image.png" alt=""></p>
<p>train[&quot;Embarked&quot;].isnull()
<img src="https://velog.velcdn.com/images/sh_-s2/post/1dac2011-2d3b-4bf8-bfd1-ce60ae26e091/image.png" alt=""></p>
<p>train[train[&quot;Embarked&quot;].isnull()]      # 불리언 인덱싱 방식으로 출력
<img src="https://velog.velcdn.com/images/sh_-s2/post/38a00002-6beb-495a-95c7-6d00db272162/image.png" alt=""></p>
<p>#불리언 인덱싱이란  Pandas에서 특정 조건을 만족하는 데이터만 선택하거나 필터링할 때 사용하는 방법. 주어진 조건에 따라 True/False 값을 반환하는 불리언 배열을 이용하여 데이터를 선택함.</p>
<p>#비어있는 데이터를 채워주는 함수 : fillna()
train[&quot;Embarked&quot;] = train[&quot;Embarked&quot;].fillna(&quot;S&quot;)</p>
<p>train[&quot;Embarked&quot;].isnull()
<img src="https://velog.velcdn.com/images/sh_-s2/post/b70714b5-3768-472e-9304-b36d92ef2bfe/image.png" alt=""></p>
<h3 id="test-fare-결측치-채우기">test-Fare 결측치 채우기</h3>
<p>#상관관계 확인 : corr()
train.corr(numeric_only= True)   #문자열로 된 컬럼 포함 X
                                 # -1 ~ 1 값을 갖게 되는데 -1, 1에 가까울수록                                      상관 관계가 높다
                                 # Pclass가 Fare와 상관 관계가 높다!
<img src="https://velog.velcdn.com/images/sh_-s2/post/5886bfdc-dba8-492b-81c9-6b518999eb73/image.png" alt=""></p>
<p>#기술통계랑 확인
train[&quot;Fare&quot;].describe()     # 평균값이 의미가 없으 중앙값을 사용하자!
<img src="https://velog.velcdn.com/images/sh_-s2/post/45c195c5-a332-4984-b80b-0ad80d4eaaa4/image.png" alt=""></p>
<p>train[[&quot;Pclass&quot;,&quot;Fare&quot;]].groupby([&quot;Pclass&quot;]).median()<br>#클래스별로 중앙값 출력해보면!
<img src="https://velog.velcdn.com/images/sh_-s2/post/4aea1ec1-1ec6-49a5-aa3d-c53699bd262d/image.png" alt=""></p>
<p>test[test[&quot;Fare&quot;].isnull()]    #Fare가 null인 데이터 확인!
<img src="https://velog.velcdn.com/images/sh_-s2/post/8a145608-f396-4787-bbd7-0e2a37b9b0a4/image.png" alt=""></p>
<p>#test에서 Fare가 null인 값을 채워주자
test[&quot;Fare&quot;] = test[&quot;Fare&quot;].fillna(8.05)</p>
<p>test[&quot;Fare&quot;] #확인해보면!
<img src="https://velog.velcdn.com/images/sh_-s2/post/2e075994-a2ee-4700-8ec0-9c0aefeb7df2/image.png" alt=""></p>
<h3 id="age-결측치-채우기">Age 결측치 채우기</h3>
<ul>
<li>train, test 모두 채우기</li>
<li>평균값, 최빈값, 중앙값  →  평균값으로 채워주자</li>
<li>다른 컬럼과의 상관관계를 보고 채워주자</li>
</ul>
<p>#기술통계량
train[&quot;Age&quot;].describe()
<img src="https://velog.velcdn.com/images/sh_-s2/post/1d0a835a-8632-428b-a2b1-b0cbb21134f8/image.png" alt=""></p>
<p>#Age 컬럼과 상관관계가 높은 컬럼은 Pclass 컬럼
train.corr(numeric_only=True)
<img src="https://velog.velcdn.com/images/sh_-s2/post/06f77c3a-75ea-4961-918d-0ddafcf81c89/image.png" alt=""></p>
<p>gb = train[[&quot;Pclass&quot;,&quot;Sex&quot;,&quot;Age&quot;]].groupby([&quot;Pclass&quot;,&quot;Sex&quot;]).mean()
#gd에 넣어서 확인해보면!
gb
<img src="https://velog.velcdn.com/images/sh_-s2/post/eabd76bf-3268-4f4a-b3e1-8bf32e17f700/image.png" alt=""></p>
<p>#다중인덱스(멀티인덱스, 중복인덱스)
gb.loc[(1,&quot;female&quot;)]
<img src="https://velog.velcdn.com/images/sh_-s2/post/2a0c881b-e847-4eff-a393-d36ebb405a9b/image.png" alt=""></p>
<p>#Age의 결측치를 채우기 위해서 pclass 와 Sex를 확인 후
#Age 평균값을 인덱싱해서 채워주자!!
#apply() → df에서 특정 컬럼에 접근해서 데이터 값 전부 함수처리</p>
<p>def fill_age(row) :
    if np.isnan(row[&quot;Age&quot;]) :        # 결측치를 확인하는 함수 : np.isnan(대상)
        return gb.loc[(row[&quot;Pclass&quot;],row[&quot;Sex&quot;])]     # gb에 접근해서 반환할 값을 실어보냄
    else :                          # 결측치가 아니라면
        return row[&quot;Age&quot;] </p>
<p>train[&quot;Age&quot;] = train.apply(fill_age, axis=1)    # train 데이터를 일일이 확인한 후 시리즈 생성
                                                # train[&quot;Age&quot;]를 교체</p>
<p>train.info()
#.info로 확인</p>
<p><img src="https://velog.velcdn.com/images/sh_-s2/post/bf0d7f55-8926-472f-b89d-b0e2181071c4/image.png" alt=""></p>
<p>pd.DataFrame(train)
<img src="https://velog.velcdn.com/images/sh_-s2/post/a8c4a54a-c6f2-4af0-8d06-8b068ac3a5d0/image.png" alt=""></p>
<p>#멀티인덱스를 사용해서 데이터 타임이 object으로 바뀌어버림 -&gt; 형변환이 필요!!</p>
<p>train[&quot;Age&quot;]=train[&quot;Age&quot;].astype(np.int64)</p>
<p>#test 데이터 Age 채우기
test[&quot;Age&quot;] = test.apply(fill_age, axis=1)</p>
<p>test[&quot;Age&quot;] = test[&quot;Age&quot;].astype(np.int64)</p>
<h3 id="cabin-결측치-채우기">Cabin 결측치 채우기</h3>
<p>train.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/1247f104-25f4-453e-9438-dc0a4b2ab66b/image.png" alt=""></p>
<p>#cabin의 값을 중복없이 확인
train[&#39;Cabin&#39;].unique()
<img src="https://velog.velcdn.com/images/sh_-s2/post/5a7e83c6-211f-4a1c-b299-c4b2dacd5c4f/image.png" alt=""></p>
<p>#Cabin → 층 + 방번호
#결측치가 너무 많아서 채워주기는 어렵고 결측치라는 표시로 &quot;M&quot;으로 채울 것
train[&quot;Cabin&quot;] = train[&#39;Cabin&#39;].fillna(&#39;M&#39;)
test[&quot;Cabin&quot;] = test[&#39;Cabin&#39;].fillna(&#39;M&#39;)</p>
<p>#Cabin에서 첫번째 글자만 추출
train[&#39;Cabin&#39;] = train[&#39;Cabin&#39;].str[0]
test[&#39;Cabin&#39;] = test[&#39;Cabin&#39;].str[0]</p>
<p>train
test.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/d0295d94-0904-42f0-9015-049679c59cb5/image.png" alt=""></p>
<h3 id="4-eda">4. EDA</h3>
<ul>
<li>이상치를 판단해야 되는지 시각화로 확인</li>
<li>특성공학(feature Engineering) : 컬럼 삭제, 컬럼 추가(합계,평균)</li>
</ul>
<p>train[&#39;Name&#39;].head(5)
<img src="https://velog.velcdn.com/images/sh_-s2/post/adbddced-460f-4b74-a4f6-edd367599665/image.png" alt=""></p>
<p>#Cabin 시각화
sns.countplot(data = train,
             x = &#39;Cabin&#39;,
             hue = &#39;Survived&#39;)
plt.show()
#Cabin이 결측치일 때 사망자 비율이 높으므로 예측 지표로 삼을 수 있음
<img src="https://velog.velcdn.com/images/sh_-s2/post/7af7054f-96a9-4377-9648-41e263b1d2c2/image.png" alt=""></p>
<p>#Pcalss 시각화
sns.countplot(data = train,
             x = &#39;Pclass&#39;,
             hue = &#39;Survived&#39;)
plt.show()
#1등칸은 생존자 비율이 높고, 3등칸은 사망자 비율이 높다!
<img src="https://velog.velcdn.com/images/sh_-s2/post/30fb6fc7-6cb9-4ee7-aa8e-37070e42df37/image.png" alt=""></p>
<p>sns.countplot(data=train,
             x=&#39;Cabin&#39;,
             hue=&quot;Pclass&quot;)
plt.show()
<img src="https://velog.velcdn.com/images/sh_-s2/post/2d229536-5f9f-45aa-b076-4ecbbcbf6315/image.png" alt=""></p>
<p>#성별 시각화
sns.countplot(data=train,
             x=&#39;Sex&#39;,
             hue=&#39;Survived&#39;)
plt.show()
#남성의 사망률이 높다! -&gt; 3등칸이면서, 남성이면서, Cabin이 &quot;M&quot;인 경우 사망의 확률이 높다!!
<img src="https://velog.velcdn.com/images/sh_-s2/post/5f688ea9-ec28-48b3-b471-035d17e18303/image.png" alt=""></p>
<p>#승선상에 따른 생존여부 비율 확인
sns.countplot(data=train,
              x= &#39;Embarked&#39;,
              hue = &#39;Survived&#39;)
<img src="https://velog.velcdn.com/images/sh_-s2/post/753e0e04-a212-4836-942c-ea4322162f13/image.png" alt=""></p>
<p>#S에서 탄 사람이 몇등칸에 탔는지 확인
sns.countplot(data=train,
              x=&#39;Embarked&#39;,
              hue=&#39;Pclass&#39;)
<img src="https://velog.velcdn.com/images/sh_-s2/post/869f6641-1be3-4381-a19d-d2a2242487f4/image.png" alt=""></p>
<p>#나이 데이터 시각화
sns.countplot(data=train,
              x=&#39;Age&#39;,
              hue=&#39;Survived&#39;)
<img src="https://velog.velcdn.com/images/sh_-s2/post/2484aefd-b9af-4283-9cd6-8000bd383bab/image.png" alt=""></p>
<p>#바이올린 플랏 : 바이올린 형태로 데이터의 분포와 밀도를 곡선으로 표현한 그래프
sns.violinplot(data=train,
               x=&#39;Survived&#39;,
               y=&#39;Age&#39;)
<img src="https://velog.velcdn.com/images/sh_-s2/post/2620aedc-173f-4a7d-b0f6-ec76fab12749/image.png" alt="">
#가오리 닮았음</p>
<p>#바이올린 플랏 : 바이올린 형태로 데이터의 분포와 밀도를 곡선으로 표현한 그래프
sns.violinplot(data=train,
               x=&#39;Sex&#39;,
               hue=&#39;Survived&#39;,
               y=&#39;Age&#39;,
               split=True)
#어린아이중 남자아이가 유독 많이 생존함 -&gt; 혈토을 유지하기 위한 남아선호사상 관념이 자리잡혀 있었음.
<img src="https://velog.velcdn.com/images/sh_-s2/post/b01b230d-39a4-4fa9-bac9-5c8541cc28f2/image.png" alt="">
#변형가오리!</p>
<p>train #찍어보면!
<img src="https://velog.velcdn.com/images/sh_-s2/post/55252363-6015-4a21-bd38-8fdc22ac8445/image.png" alt=""></p>
<h3 id="특성공학">특성공학</h3>
<ul>
<li>특성들을 파악하여 합치거나 나누었을 때 유의미한 결과를 내도록 변형</li>
<li>Parch, sibsp 두 특성 합쳐서 Family라는 새로운 특성을 만들 수 있음</li>
</ul>
<p>train[&#39;Family&#39;] = train[&#39;SibSp&#39;] + train[&#39;Parch&#39;] + 1    #나 자신도 더해주자
test[&#39;Family&#39;] = test[&#39;SibSp&#39;] + test[&#39;Parch&#39;] + 1
test #확인해보면!!!!
<img src="https://velog.velcdn.com/images/sh_-s2/post/0fcf48f9-625f-4fa3-b381-20c97f0df992/image.png" alt=""></p>
<p>#가족원 수가 생존여부와 상관이 있는지 확인
sns.countplot(data=train,
              x=&#39;Family&#39;,
              hue=&#39;Survived&#39;)
#1명일 때 사망률이 높다.
#2~4일 때 생존율이 높다.
#5명 이상일 때 사망률이 높다.
#사소한 관찰의 오류 : 데이터가 편향되어 있어서 특징이 안보임. =&gt; 범주화(숫자 -&gt; 문자형으로 변환)
<img src="https://velog.velcdn.com/images/sh_-s2/post/65cf8e82-0791-41a5-b396-6475c42e362d/image.png" alt=""></p>
<p>#카테고리화 진행
train[&#39;Family&#39;]=pd.cut(train[&#39;Family&#39;], bins=[ 0, 1 , 4, 11], labels=[&#39;Alone&#39;,&#39;Small&#39;,&#39;Large&#39;])                        # bins[ 앞의 값 초과, 뒤값 이하]
test[&#39;Family&#39;]=pd.cut(test[&#39;Family&#39;], bins=[ 0, 1 , 4, 11], labels=[&#39;Alone&#39;,&#39;Small&#39;,&#39;Large&#39;])
test
<img src="https://velog.velcdn.com/images/sh_-s2/post/1bf2b466-be51-412c-a81f-135f300e711c/image.png" alt=""></p>
<p>sns.countplot(data=train,
              x=&#39;Family&#39;,
              hue=&#39;Survived&#39;)
<img src="https://velog.velcdn.com/images/sh_-s2/post/31f3d7d2-c9d0-45ff-9730-45741fc31a2a/image.png" alt=""></p>
<p>train[&#39;Name&#39;]
<img src="https://velog.velcdn.com/images/sh_-s2/post/db1bd234-83d2-4a39-8e68-8793dbfa0c63/image.png" alt=""></p>
<p>train[&#39;Ticket&#39;]
<img src="https://velog.velcdn.com/images/sh_-s2/post/48fe91ed-94e8-461d-ad96-18eedcc88e6c/image.png" alt=""></p>
<p>train.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/41c3ebe2-c088-4330-8f9f-df46b7770c44/image.png" alt=""></p>
<p>#Name, SibSp, Parch, Ticket 삭제
train.drop([&#39;Name&#39;, &#39;SibSp&#39;, &#39;Parch&#39;, &#39;Ticket&#39;],axis=1, inplace=True )
test.drop([&#39;Name&#39;, &#39;SibSp&#39;, &#39;Parch&#39;, &#39;Ticket&#39;],axis=1, inplace=True )</p>
<p>train.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/4e691890-a64f-4676-83c0-9ea0f90b7819/image.png" alt=""></p>
<p>test.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/c9aa4c11-d28c-4707-9129-fdf4f73b4071/image.png" alt=""></p>
<p>#X,y 분리
y_train= train[&#39;Survived&#39;]
X_train= train.drop(&#39;Survived&#39;,axis=1)
X_test = test
X_test
<img src="https://velog.velcdn.com/images/sh_-s2/post/e4f3a61f-bb59-4e60-b7c5-22ebe87350ed/image.png" alt=""></p>
<p>#문자형 데이터를 수치형으로 인코딩!(원핫인코딩 -get_dummies)
X_train = pd.get_dummies(X_train)
X_test = pd.get_dummies(X_test)
X_train.shape , X_test.shape    # 원핫인코딩 후 컬럼 개수의 차이가 발생
<img src="https://velog.velcdn.com/images/sh_-s2/post/d4624220-7ff6-4e3b-898c-4bee9afcb4cb/image.png" alt=""></p>
<p>#X_train 에는 있고, X_test에는 없는 컬럼 찾기
#집합자료형    {}
set(X_train.columns) - set(X_test.columns)  # &#39;Cabin_T&#39; 는 train에만 있는 특성
<img src="https://velog.velcdn.com/images/sh_-s2/post/5667da5d-a490-4947-b7bc-92e5748e94e7/image.png" alt=""></p>
<p>#불리언 인덱싱으로 Cabin_T가 True인 데이터 확인
X_train[X_train[&#39;Cabin_T&#39;]==1]
<img src="https://velog.velcdn.com/images/sh_-s2/post/cf04c5d1-3f66-4674-86fe-4eb29e5f5fa8/image.png" alt="">
#이런식으로 나옴</p>
<p>#test에 Cabin_T 컬럼을 추가
X_test[&#39;Cabin_T&#39;] = 0</p>
<p>X_test.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/a449b999-3dc6-4229-9c79-a789e2da7275/image.png" alt=""></p>
<p>#X_train 의 컬럼 순서 변경</p>
<p>#임의의 변수에 Cabin_T를 담아두자
temp = X_train[&#39;Cabin_T&#39;]
temp
<img src="https://velog.velcdn.com/images/sh_-s2/post/72f2f323-f0c0-4a19-991c-33423b3787fc/image.png" alt=""></p>
<p>#Cabin_T 삭제
X_train.drop(&#39;Cabin_T&#39;, axis=1,inplace=True)
X_train.info()
<img src="https://velog.velcdn.com/images/sh_-s2/post/f24cbe0a-6089-45ad-87a6-8eae2b4a8a62/image.png" alt=""></p>
<p>#다시 X_train과 temp를 병합
X_train = pd.concat([X_train, temp], axis=1)
X_train
<img src="https://velog.velcdn.com/images/sh_-s2/post/0248ed5e-29d0-41ef-9ba5-92420a88bb10/image.png" alt=""></p>
<p>set(X_train.columns) - set(X_test.columns)
set() -&gt; 출력됨</p>
<h3 id="5-모델-선택">5. 모델 선택</h3>
<ul>
<li>KNN, DT, randomForest, Logistic Regression</li>
</ul>
<h4 id="knn-모델">knn 모델</h4>
<p>from sklearn.neighbors import KNeighborsClassifier</p>
<p>#객체생성
knn = KNeighborsClassifier()</p>
<h3 id="6-학습">6. 학습</h3>
<p>knn.fit(X_train, y_train)
<img src="https://velog.velcdn.com/images/sh_-s2/post/fb2cac5b-d5b9-4f40-af10-3bce8c600247/image.png" alt=""></p>
<h3 id="7-학습-및-평가">7. 학습 및 평가</h3>
<p>knn.score(X_train, y_train)
<img src="https://velog.velcdn.com/images/sh_-s2/post/b035dd44-b3f8-457c-b435-eb741cd3e144/image.png" alt="">
#결과값 나옴</p>
<p>#예측
pre = knn.predict(X_test)  # 정답데이터는 캐글에..</p>
<p>pre #출력해보면
<img src="https://velog.velcdn.com/images/sh_-s2/post/7e784c7d-e97b-4535-82b3-148f309c64c4/image.png" alt=""></p>
<p>result = pd.read_csv(&quot;./data/gender_submission.csv&quot;)
result
<img src="https://velog.velcdn.com/images/sh_-s2/post/0095324a-2e6a-4ea9-9bb3-1b80b1bd91f1/image.png" alt=""></p>
<p>result[&#39;Survived&#39;] = pre        # knn이 예측한 답으로 교체
#csv파일로 내보내기
result.to_csv(&quot;./data/gender_submission_knn.csv&quot;,index=False)</p>
<p>###혼자해보기
#DT
from sklearn.tree import DecisionTreeClassifier</p>
<p>#객체 생성
dt = DecisionTreeClassifier(random_state=42)</p>
<p>#학습
dt.fit(X_train, y_train)
<img src="https://velog.velcdn.com/images/sh_-s2/post/d9b2e664-ea23-47b3-9161-6fbec7f1e4e6/image.png" alt=""></p>
<p>#예측
dt_predictions = dt.predict(X_test)
dt_predictions
<img src="https://velog.velcdn.com/images/sh_-s2/post/85cf895c-b667-4df8-88e2-a956a849ed0e/image.png" alt=""></p>
<p>#결과 저장
result[&#39;Survived&#39;] = dt_predictions
result.to_csv(&#39;./data/gender_submission_dt.csv&#39;, index=False)</p>
<p>#랜덤포레스트
from sklearn.ensemble import RandomForestClassifier</p>
<p>#객체 생성
rf = RandomForestClassifier(random_state=42)</p>
<p>#학습
rf.fit(X_train, y_train)
<img src="blob:https://velog.io/cc3e0a54-cc22-4247-80d1-9072e33acd44" alt="업로드중.."></p>
<p>#예측
rf_predictions = rf.predict(X_test)
<img src="blob:https://velog.io/2c5b3754-81f2-43f9-8c9f-d2ab2c1dfa90" alt="업로드중.."></p>
<p>#결과 저장
result[&#39;Survived&#39;] = rf_predictions
result.to_csv(&#39;./data/gender_submission_rf.csv&#39;, index=False)</p>
<p>#LogisticRegression
from sklearn.linear_model import LogisticRegression</p>
<p>#객체 생성
lr = LogisticRegression(random_state=42, max_iter=1000)</p>
<p>#학습
lr.fit(X_train, y_train)
<img src="blob:https://velog.io/086f7e53-b738-40e4-8bb0-2c494c7205e4" alt="업로드중.."></p>
<p>#예측
lr_predictions = lr.predict(X_test)
lr_predictions
<img src="blob:https://velog.io/74f9223e-eddb-4e53-9095-692dca9d7354" alt="업로드중.."></p>
<p>#결과 저장
result[&#39;Survived&#39;] = lr_predictions
result.to_csv(&#39;./data/gender_submission_lr.csv&#39;, index=False)</p>
<p>마무리를 하며 너무 어려워요..!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Static]]></title>
            <link>https://velog.io/@sh_-s2/Static</link>
            <guid>https://velog.io/@sh_-s2/Static</guid>
            <pubDate>Tue, 29 Apr 2025 08:52:35 GMT</pubDate>
            <description><![CDATA[<p>public class Exstatic {</p>
<pre><code>public static void main(String[] args) {
    /*
     * 1. static이란 무엇인가?
     *      클래스에 고정된 고용 저장공간
     * 2. static 변수 (field)
     *      모든 객체가 &#39;공유&#39;하는 값
     *      객체를 만들지 않고 클래스 이름으로 접근
     * 3. static 메서드 (method)
     *      객체 없이 호출하는 함수
     *      static 변수만 접근 가능
     * 4. static final 상수(constant)
     *      변하지 않는 고정값
     *      대문자로 작성하는 것이 관례
     */
    StaticDemo a = new StaticDemo();
    StaticDemo.showStaticInfo();

    StaticDemo b = new StaticDemo();
    StaticDemo.showStaticInfo();

    StaticDemo c = new StaticDemo();
    StaticDemo.showStaticInfo();

    int a1=56,b1=14;
    System.out.println(Math.max(a1, b1));

}</code></pre><p>}</p>
<p>//staticDemo
class StaticDemo{
    //1. static 변수(모든 객체가 공유)
    static int staticCounter = 0;</p>
<pre><code>//2. 일반 인스턴스 변수(객체마다 별도로 존재)
int instanceCounter = 0;

//3. static final 상수(절대 변하지 않는 값)
static final int MAX_VALUE=100;

//생성자(Constructor)
StaticDemo(){
    staticCounter++;
    instanceCounter++;

}

//4. static메서드(객체 없이 호출 가능)
static void showStaticInfo(){
    System.out.println(&quot;static 변수 : &quot;+staticCounter);
    System.out.println(&quot;최대값 상수 : &quot;+MAX_VALUE);
}

//5. 일반 인스턴스 메서드
void showInstanceInfo(){
    System.out.println(&quot;instance 변수 : &quot;+instanceCounter);
}</code></pre><p>}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex02_ 개발자]]></title>
            <link>https://velog.io/@sh_-s2/Ex02-%EA%B0%9C%EB%B0%9C%EC%9E%90</link>
            <guid>https://velog.io/@sh_-s2/Ex02-%EA%B0%9C%EB%B0%9C%EC%9E%90</guid>
            <pubDate>Fri, 28 Mar 2025 14:32:36 GMT</pubDate>
            <description><![CDATA[<p>Ex02_개발자</p>
<h3 id="시나리오">시나리오</h3>
<ul>
<li>스마트인재개발원에서 수료하고 프론트엔드 직무로 입사한 박개발 인턴은 진로에 대한 고민을 갖고 있음!</li>
<li>급여가 살짝 본인의 기대에 못 미쳤다고 함...</li>
<li>더 높은 급여를 받고 싶기 때문에 어떠한 노력이 필요한지, 현직 개발자데이터를 분석함으로써 본인에게 걸맞는 솔루션을 도출해보자!</li>
</ul>
<p>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns</p>
<h2 id="시나리오-전-dataframe-다뤄보기">시나리오 전 DataFrame 다뤄보기!</h2>
<ul>
<li>데이터 분석을 진행하기 전에 전반적인 DataFrame을 다뤄보는 시간을 가져보자!</li>
</ul>
<h1 id="한국어-데이터---utf-8-euc-kr-cp949">한국어 데이터 -&gt; UTF-8, EUC-KR, CP949</h1>
<p>data = pd.read_csv(&quot;data/Developer Salary.csv&quot;, encoding = &quot;EUC-KR&quot;)
data.head(3)</p>
<h1 id="set_index컬럼명-특정-컬럼을-인덱스로-설정">set_index(&quot;컬럼명&quot;) 특정 컬럼을 인덱스로 설정</h1>
<p>data.set_index(&quot;일련번호&quot;, inplace = True)</p>
<h1 id="데이터-확인">데이터 확인</h1>
<p>data.info()
data.head()</p>
<table>
<thead>
<tr>
<th>항목</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>일련번호</td>
<td>각 데이터의 고유 번호</td>
</tr>
<tr>
<td>나이</td>
<td>35세 미만(&lt;35) 또는 35세 이상(&gt;35)</td>
</tr>
<tr>
<td>학력</td>
<td>- Undergraduate: 학사<br>- Master: 석사<br>- phD: 박사<br>- NoHigherEd: 고등학교 졸업<br>- Other: 그 외</td>
</tr>
<tr>
<td>성별</td>
<td>- Man: 남자<br>- Woman: 여자<br>- NonBinary: 제 3의 성</td>
</tr>
<tr>
<td>정신건강</td>
<td>- Yes: 건강<br>- No: 병력 있음</td>
</tr>
<tr>
<td>전문직</td>
<td>전문개발자 여부 (삭제 예정)</td>
</tr>
<tr>
<td>개발공부기간</td>
<td>코딩을 공부한 기간 (수치형)</td>
</tr>
<tr>
<td>연차</td>
<td>개발자로 일한 기간 (수치형)</td>
</tr>
<tr>
<td>국적</td>
<td>- 독일<br>- 캐나다<br>- 영국<br>- 미국<br>- 인도<br>- 일본<br>- 한국</td>
</tr>
<tr>
<td>연봉</td>
<td>1년간 받는 급여 (달러 단위)</td>
</tr>
<tr>
<td>보유기술개수</td>
<td>해당 사람이 다룰 수 있는 기술의 개수 (수치형)</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex01_육군데이터]]></title>
            <link>https://velog.io/@sh_-s2/Ex01%EC%9C%A1%EA%B5%B0%EB%8D%B0%EC%9D%B4%ED%84%B0</link>
            <guid>https://velog.io/@sh_-s2/Ex01%EC%9C%A1%EA%B5%B0%EB%8D%B0%EC%9D%B4%ED%84%B0</guid>
            <pubDate>Fri, 28 Mar 2025 14:31:38 GMT</pubDate>
            <description><![CDATA[<p>Ex01_ 육군데이터</p>
<blockquote>
<p>학습목표 : 육군신체정보 데이터를 활용해서 Series 연산, 데이터 색인 등의 기초적인 데이터 활용법을 익혀보자!</p>
</blockquote>
<ul>
<li>육군 신체 정보(키, 몸무게)를 활용해서 BMI라는 새로운 정보를 만들어내자! (컬럼추가, 특성확장 등)</li>
</ul>
<blockquote>
<p>Ctrl + Shift + - : 셀 나누기 <br>
Shift + m : 셀 병합</p>
</blockquote>
<ol start="0">
<li>필요한 <u>라이브러리</u>불러오기</li>
</ol>
<p>import numpy as np  # 수치계산 특화
import pandas as pd # 데이터 정제, 조작
import matplotlib.pyplot as plt # 차트</p>
<h1 id="from-matplotlib-import-pyplot-as-plt">from matplotlib import pyplot as plt</h1>
<ol>
<li>데이터 불러오기</li>
</ol>
<ul>
<li>절대경로 : &quot;/&quot; /Users/smhrd/4. 데이터 분석 기초/data/육군신체측정정보.csv</li>
<li>상대경로</li>
<li>&quot;./&quot; : ./data/육군신체측정정보.csv</li>
<li>&quot;../&quot; : 상위 디렉토리 지정</li>
</ul>
<p>data = pd.read_csv(&quot;./data/육군신체측정정보.csv&quot;, low_memory = False)</p>
<h1 id="dtype-경고메세지--column-데이터-타입-문제가-있어서-뜨는-경고">Dtype 경고메세지 : column 데이터 타입 문제가 있어서 뜨는 경고</h1>
<ol start="2">
<li>데이터 확인</li>
</ol>
<ul>
<li>결측치 여부, 각 컬럼마다 Dtype은 어떻게 구성되어있는지 파악</li>
</ul>
<p>data.info()</p>
<h1 id="데이터를-로드하는-경우-꼭-info를-사용하길-권장">데이터를 로드하는 경우, 꼭 info()를 사용하길 권장!</h1>
<h1 id="1-결측치-확인-→-결측치가-존재하는-경우-데이터를-다루는게-불편해짐">1. 결측치 확인 → 결측치가 존재하는 경우, 데이터를 다루는게 불편해짐!</h1>
<h1 id="2-dtype-확인-→-bmi-구하기-위해서는-숫자-형태의-데이터가-필요함-object문자형으로-이루어져서-연산이-불가함">2. Dtype 확인 → BMI 구하기 위해서는 숫자 형태의 데이터가 필요함! Object(문자형)으로 이루어져서 연산이 불가함!</h1>
<p>data.head(10) # 상위 10ea 확인</p>
<h1 id="신장-몸무게-컬럼은-cm-kg과-같은-문자가-있어서-object형으로-load-된-것을-확인">신장, 몸무게 컬럼은 cm, kg과 같은 문자가 있어서 object형으로 load 된 것을 확인!</h1>
<h1 id="단위-문자들을-제거-형변환">단위 문자들을 제거, 형변환</h1>
<ol start="3">
<li>문자 데이터 전처리</li>
</ol>
<h3 id="문자열-함수">문자열 함수</h3>
<table>
<thead>
<tr>
<th>함수</th>
<th>사용법</th>
<th>설명</th>
<th>반환값</th>
</tr>
</thead>
<tbody><tr>
<td>replace</td>
<td>str.replace(old, new[, count])</td>
<td>문자열에서 old를 new로 대체</td>
<td>새 문자열</td>
</tr>
<tr>
<td>upper</td>
<td>str.upper()</td>
<td>문자열의 모든 문자를 대문자로 변환</td>
<td>새 문자열</td>
</tr>
<tr>
<td>lower</td>
<td>str.lower()</td>
<td>문자열의 모든 문자를 소문자로 변환</td>
<td>새 문자열</td>
</tr>
<tr>
<td>strip</td>
<td>str.strip([chars])</td>
<td>문자열 양쪽 끝의 공백이나 chars에 지정된 문자 제거</td>
<td>새 문자열</td>
</tr>
<tr>
<td>lstrip</td>
<td>str.lstrip([chars])</td>
<td>문자열 왼쪽 끝의 공백이나 chars에 지정된 문자 제거</td>
<td>새 문자열</td>
</tr>
<tr>
<td>rstrip</td>
<td>str.rstrip([chars])</td>
<td>문자열 오른쪽 끝의 공백이나 chars에 지정된 문자 제거</td>
<td>새 문자열</td>
</tr>
<tr>
<td>find</td>
<td>str.find(sub[, start[, end]])</td>
<td>부분 문자열 sub이 처음 나타나는 위치 탐색</td>
<td>위치 인덱스 또는 -1</td>
</tr>
<tr>
<td>rfind</td>
<td>str.rfind(sub[, start[, end]])</td>
<td>부분 문자열 sub이 마지막으로 나타나는 위치 탐색</td>
<td>위치 인덱스 또는 -1</td>
</tr>
<tr>
<td>split</td>
<td>str.split([sep[, maxsplit]])</td>
<td>sep을 기준으로 문자열을 나눔</td>
<td>문자열 리스트</td>
</tr>
<tr>
<td>rsplit</td>
<td>str.rsplit([sep[, maxsplit]])</td>
<td>sep을 기준으로 문자열을 오른쪽에서부터 나눔</td>
<td>문자열 리스트</td>
</tr>
<tr>
<td>join</td>
<td>str.join(iterable)</td>
<td>iterable의 각 요소를 문자열로 연결</td>
<td>새 문자열</td>
</tr>
<tr>
<td>count</td>
<td>str.count(sub[, start[, end]])</td>
<td>문자열에서 부분 문자열 sub의 출현 횟수 계산</td>
<td>정수</td>
</tr>
<tr>
<td>index</td>
<td>str.index(sub[, start[, end]])</td>
<td>부분 문자열 sub이 처음 나타나는 위치 탐색(찾지 못하면 예외 발생)</td>
<td>위치 인덱스</td>
</tr>
<tr>
<td>rindex</td>
<td>str.rindex(sub[, start[, end]])</td>
<td>부분 문자열 sub이 마지막으로 나타나는 위치 탐색(찾지 못하면 예외 발생)</td>
<td>위치 인덱스</td>
</tr>
<tr>
<td>startswith</td>
<td>str.startswith(prefix[, start[, end]])</td>
<td>문자열이 지정된 접두어로 시작하는지 여부</td>
<td>불리언</td>
</tr>
<tr>
<td>endswith</td>
<td>str.endswith(suffix[, start[, end]])</td>
<td>문자열이 지정된 접미어로 끝나는지 여부</td>
<td>불리언</td>
</tr>
<tr>
<td>isdigit</td>
<td>str.isdigit()</td>
<td>문자열이 숫자로만 구성되어 있는지 여부</td>
<td>불리언</td>
</tr>
<tr>
<td>isalpha</td>
<td>str.isalpha()</td>
<td>문자열이 알파벳 문자로만 구성되어 있는지 여부</td>
<td>불리언</td>
</tr>
<tr>
<td>isalnum</td>
<td>str.isalnum()</td>
<td>문자열이 알파벳 문자와 숫자로만 구성되어 있는지 여부</td>
<td>불리언</td>
</tr>
<tr>
<td>isspace</td>
<td>str.isspace()</td>
<td>문자열이 공백 문자로만 구성되어 있는지 여부</td>
<td>불리언</td>
</tr>
<tr>
<td>istitle</td>
<td>str.istitle()</td>
<td>문자열이 타이틀 케이스(각 단어의 첫 글자가 대문자)인지 여부</td>
<td>불리언</td>
</tr>
<tr>
<td>capitalize</td>
<td>str.capitalize()</td>
<td>문자열의 첫 글자를 대문자로, 나머지는 소문자로 변환</td>
<td>새 문자열</td>
</tr>
<tr>
<td>title</td>
<td>str.title()</td>
<td>각 단어의 첫 글자를 대문자로, 나머지는 소문자로 변환</td>
<td>새 문자열</td>
</tr>
<tr>
<td>zfill</td>
<td>str.zfill(width)</td>
<td>문자열의 왼쪽을 &#39;0&#39;으로 채워 지정된 너비에 맞춤</td>
<td>새 문자열</td>
</tr>
<tr>
<td>ljust</td>
<td>str.ljust(width[, fillchar])</td>
<td>문자열을 지정된 너비로 왼쪽 정렬</td>
<td>새 문자열</td>
</tr>
<tr>
<td>rjust</td>
<td>str.rjust(width[, fillchar])</td>
<td>문자열을 지정된 너비로 오른쪽 정렬</td>
<td>새 문자열</td>
</tr>
<tr>
<td>center</td>
<td>str.center(width[, fillchar])</td>
<td>문자열을 지정된 너비로 중앙 정렬</td>
<td>새 문자열</td>
</tr>
<tr>
<td>encode</td>
<td>str.encode(encoding=&#39;utf-8&#39;, errors=&#39;strict&#39;)</td>
<td>문자열을 지정된 인코딩으로 인코딩</td>
<td>바이트 객체</td>
</tr>
<tr>
<td>format</td>
<td>str.format(<em>args, *</em>kwargs)</td>
<td>문자열의 형식을 지정된 값으로 채움</td>
<td>새 문자열</td>
</tr>
</tbody></table>
<p>python for value in data.loc[:, &quot;신장 센티미터&quot;] :      print(value.replace(&quot; cm&quot;, &quot;&quot;)) </p>
<h1 id="data신장-센티미터--기본적으로-열접근을-지원-series들의-모임이기-때문">data[&quot;신장 센티미터&quot;] # 기본적으로 열접근을 지원! (Series들의 모임이기 때문!)</h1>
<h1 id="str-속성--pandas-객체series-dataframe에서-문자열-함수를-적용하고자-하거나-다루고자-할-때-사용하는-속성">str 속성 : pandas 객체(Series, DataFrame)에서 문자열 함수를 적용하고자 하거나, 다루고자 할 때 사용하는 속성</h1>
<p>height = data.loc[ : ,&quot;신장 센티미터&quot;].str.replace(&quot; cm&quot;, &quot;&quot;)</p>
<p>weight = data.loc[ : ,&quot;몸무게 킬로그램&quot;].str.replace(&quot; kg&quot;, &quot;&quot;)</p>
<p>height, weight</p>
<h1 id="단위제거-이후-형변환casting">단위제거 이후 형변환(casting)</h1>
<p>print(height.dtype) # object 형!</p>
<p>height = height.astype(&quot;float64&quot;)
weight = weight.astype(&quot;float64&quot;)</p>
<p>height, weight</p>
<ol start="4">
<li>Series 연산</li>
</ol>
<h1 id="단위-변환-cm-에서-m로">단위 변환 (cm 에서 m로)</h1>
<p>meter_height = height * 0.01
bmi = weight / meter_height ** 2
bmi = bmi.round(2)</p>
<p>bmi</p>
<ol start="5">
<li>데이터 추가</li>
</ol>
<ul>
<li>추가 &amp; 수정(업데이트) → 지정하고 대입하면 끝!</li>
<li>지정 했을 때 key값이 없는 경우! → 추가</li>
<li>지정 했을 때 key값이 있는 경우! → 수정(업데이트)</li>
</ul>
<h1 id="databmi--bmi">data[&#39;bmi&#39;] = bmi</h1>
<p>data.loc[:,&#39;bmi&#39;] = bmi</p>
<p>data</p>
<h1 id="실습-bmi-기준으로-고도비만30이상인-사람을-조회해보기">실습! BMI 기준으로 고도비만(30이상)인 사람을 조회해보기!</h1>
<p>data[&quot;bmi&quot;] &gt;= 30 # → 불리안 마스크(인덱싱 재료)</p>
<p>data[ data[&quot;bmi&quot;] &gt;= 30 ]</p>
<h1 id="실습-bmi-기준으로-정상체중185--229인-사람을-조회해보기">실습! BMI 기준으로 정상체중(18.5 ~ 22.9)인 사람을 조회해보기!</h1>
<h1 id="and-or--논리연산자-단일-값일-때-사용">and, or : 논리연산자, 단일 값일 때 사용</h1>
<h1 id="true-and-false">True and False</h1>
<h1 id="---비트연산자-다중-값일-때-사용">&amp;, | : 비트연산자, 다중 값일 때 사용</h1>
<h1 id="--비트연산자가-비교연산자보다-우선순위가-높기-때문에-소괄호-지정">() : 비트연산자가 비교연산자보다 우선순위가 높기 때문에 소괄호 지정!</h1>
<p>data[ (data[&quot;bmi&quot;] &gt;= 18.5) &amp; (data[&quot;bmi&quot;] &lt;= 22.9) ]</p>
<ol start="6">
<li>결측치 전처리</li>
</ol>
<blockquote>
<p>데이터 분석 프로세스</p>
<ol>
<li>문제정의 + 데이터 확보 방안</li>
<li>수집</li>
<li>전처리<ul>
<li>결측치 제거 or 대체</li>
<li>이상치 제거 or 대체</li>
<li>변수 처리(컬럼 추가, 선택, 삭제, 변환 등)</li>
</ul>
</li>
<li>EDA(탐색적 데이터 분석)</li>
</ol>
</blockquote>
<p>data.isnull().sum()</p>
<h1 id="결측치-확인--가슴-둘레-센티미터-머리-둘레-센티미터">결측치 확인 : 가슴 둘레 센티미터, 머리 둘레 센티미터</h1>
<p>data[ data[&quot;가슴 둘레 센티미터&quot;].isnull() ]</p>
<p>data[&quot;가슴 둘레 센티미터&quot;]</p>
<h1 id="형변환-평균값으로-결측치-대체">형변환, 평균값으로 결측치 대체</h1>
<h1 id="apply--사용자-정의-함수를-pandas-객체에-적용하기-위한-함수">apply() : 사용자 정의 함수를 Pandas 객체에 적용하기 위한 함수</h1>
<h1 id="apply-예시">apply 예시</h1>
<p>ex_data = {
&#39;Name&#39;: [&#39;John&#39;, &#39;Anna&#39;, &#39;Peter&#39;, &#39;Linda&#39;],
&#39;Email&#39;: [&#39;john@gmail.com&#39;, &#39;anna@yahoo.com&#39;, &#39;peter@gmail.com&#39;, &#39;linda@outlook.com&#39;]
}</p>
<p>df = pd.DataFrame(ex_data)
df</p>
<ul>
<li>1차원 Series apply() 적용!</li>
</ul>
<h1 id="함수-정의">함수 정의</h1>
<p>def extract_domain(email) :
return email.split(&quot;@&quot;)[1]</p>
<h1 id="1차원-series에-apply-활용하여-도메인-추출">1차원 Series에 apply() 활용하여, 도메인 추출</h1>
<p>df[&quot;Email&quot;].apply(extract_domain)</p>
<p>def extract_domain(row) :
return row[&quot;Email&quot;].split(&quot;@&quot;)[1]</p>
<p>df.iloc[2][&quot;Email&quot;].split(&quot;@&quot;)[1]</p>
<h1 id="2차원-dataframe에-apply-활용하여-도메인-추출">2차원 DataFrame에 apply() 활용하여, 도메인 추출</h1>
<p>df.apply(extract_domain, axis = 1)</p>
<p>def cm_replace(row) :</p>
<h1 id="단위-문자-제거">단위 문자 제거!</h1>
<h1 id="row가슴-둘레-센티미터--row가슴-둘레-센티미터replace-cm-">row[&quot;가슴 둘레 센티미터&quot;] = row[&quot;가슴 둘레 센티미터&quot;].replace(&quot; cm&quot;, &quot;&quot;)</h1>
<h1 id="return-row가슴-둘레-센티미터">return row[&quot;가슴 둘레 센티미터&quot;]</h1>
<h1 id="→-error-발생-내부에서-실수형으로-판단하는-듯-함">→ error 발생! 내부에서 실수형으로 판단하는 듯 함...</h1>
<p>if isinstance(row[&quot;가슴 둘레 센티미터&quot;], float) : # 자료형이 float인가?
return float(row[&quot;가슴 둘레 센티미터&quot;])       # 확실히 실수형으로 변환한다음 반환
else :                                           # 아닌 경우(문자형인 경우)
return float(row[&quot;가슴 둘레 센티미터&quot;].replace(&quot; cm&quot;, &quot;&quot;))</p>
<p>data.iloc[0]</p>
<h1 id="본-데이터-적용">본 데이터 적용!</h1>
<p>data[&quot;가슴 둘레 센티미터&quot;] = data.apply(cm_replace, axis = 1) # axis = 1 : 각각의 행을 매개변수 전달!</p>
<h1 id="apply-활용해서-float-형으로-형변환이-되었기-때문에-평균값-구할-수-있음">apply() 활용해서 float 형으로 형변환이 되었기 때문에, 평균값 구할 수 있음!!</h1>
<p>data[&quot;가슴 둘레 센티미터&quot;].mean()</p>
<h1 id="평균값으로-결측치를-대체해보자">평균값으로 결측치를 대체해보자!</h1>
<h1 id="가슴-둘레-결측치를-평균치로-수정업데이트">가슴 둘레 결측치를 평균치로 수정(업데이트)!</h1>
<p>data.loc[ data[&quot;가슴 둘레 센티미터&quot;].isnull() , &quot;가슴 둘레 센티미터&quot; ] = data[&quot;가슴 둘레 센티미터&quot;].mean()</p>
<p>data.isnull().sum()</p>
<h1 id="머리-둘레-센티미터는-결측치-데이터-삭제">머리 둘레 센티미터는 결측치 데이터 삭제!</h1>
<h1 id="data--datadropna">data = data.dropna()</h1>
<p>data.dropna(inplace = True)</p>
<p>data.shape</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex08 이미지 수]]></title>
            <link>https://velog.io/@sh_-s2/Ex08-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%88%98</link>
            <guid>https://velog.io/@sh_-s2/Ex08-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%88%98</guid>
            <pubDate>Thu, 27 Mar 2025 08:50:55 GMT</pubDate>
            <description><![CDATA[<p>from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time</p>
<h1 id="파일폴더를-생성or삭제할때-사용하는-라이브러리">파일,폴더를 생성or삭제할때 사용하는 라이브러리</h1>
<p>import os</p>
<h1 id="이미지의-경로를-파일로-변환-라이브러리">이미지의 경로를 파일로 변환 라이브러리</h1>
<p>from urllib.request import urlretrieve</p>
<h1 id="폴더생성">폴더생성</h1>
<h1 id="대화--바탕화면에-이미지라는-폴더가-없다면-바탕화면-이미지라는-폴더를-만들어라">대화 : 바탕화면에 이미지라는 폴더가 없다면, 바탕화면 이미지라는 폴더를 만들어라.</h1>
<p>if not os.path.isdir(&quot;C:/Users/smhrd1/Desktop/이미지&quot;) :
    os.mkdir(&quot;C:/Users/smhrd1/Desktop/이미지&quot;)</p>
<h1 id="이미지-데이터-수집">이미지 데이터 수집</h1>
<p>driver = wb.Chrome()</p>
<p>driver.get(&quot;<a href="https://search.naver.com/search.naver?ssc=tab.image.all&amp;where=image&amp;sm=tab_jum&amp;query=%EA%B3%A0%EC%96%91%EC%9D%B4&quot;">https://search.naver.com/search.naver?ssc=tab.image.all&amp;where=image&amp;sm=tab_jum&amp;query=%EA%B3%A0%EC%96%91%EC%9D%B4&quot;</a>)</p>
<h1 id="이미지-태그-수집">이미지 태그 수집</h1>
<p>img = driver.find_elements(By.CSS_SELECTOR,&quot;#main_pack &gt; section &gt; div.api_subject_bx._fe_image_tab_grid_root.ani_fadein &gt; div &gt; div &gt; div.image_tile._fe_image_tab_grid &gt; div &gt; div &gt; div &gt; div &gt; img&quot;)</p>
<h1 id="비어있는-리스트에-src-속성값만-저장--이미지의-주소">비어있는 리스트에 src 속성값만 저장 = 이미지의 주소</h1>
<p>src = []
for i in range(len(img)) :
    src.append(img[i].get_attribute(&quot;src&quot;))</p>
<p>#이미지의 경로를 파일로 변환</p>
<h1 id="대화--src에있는-값을-하나씩-꺼내서-바탕화면에-이미지-폴더에-저장해줘">대화 : src에있는 값을 하나씩 꺼내서, 바탕화면에 이미지 폴더에 저장해줘</h1>
<p>for i in range(len(src)) :
    urlretrieve(src[i],&quot;C:/Users/smhrd1/Desktop/이미지/&quot;+str(i)+&quot;.jpg&quot;)</p>
<h1 id="while문을-활용해서-스크롤을-끝까지-내리기">while문을 활용해서 스크롤을 끝까지 내리기.</h1>
<p>while True :
    # 스크롤을 누루기 전 상태의 페이지 정보
    first = driver.page_source
    body = driver.find_element(By.CSS_SELECTOR,&quot;body&quot;)
    body.send_keys(Keys.END)
    time.sleep(1)
    after = driver.page_source
    if first == after :
        break
    # 대화 : 지금 페이지의 정보와 누른 후의 정보가 같다면 멈춰라 아니라면? 스크롤 내려라</p>
<h1 id="이번-실습-정리">이번 실습 정리</h1>
<p>1) os 라이브러리 : 파일이나 폴더를 생성, 삭제,조회..할때 사용한다.
2) 속성추출 : get_attribute(&quot;속성이름&quot;)
    - 사용처 : img태그의 src값, a태그의 href값 저장
3) 무한스크롤 : while문을 통해서 스크롤 내리기 전, 후를 비교하여 스크롤을 끝까지 내릴 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex. 07 Gmarket 수집]]></title>
            <link>https://velog.io/@sh_-s2/Ex.-07-Gmarket-%EC%88%98%EC%A7%91</link>
            <guid>https://velog.io/@sh_-s2/Ex.-07-Gmarket-%EC%88%98%EC%A7%91</guid>
            <pubDate>Thu, 27 Mar 2025 03:21:55 GMT</pubDate>
            <description><![CDATA[<p>Ex07.Gmarket 수집</p>
<p>from selenium import webdriver as wb
from selenium.webdriver.common.by import By
import time</p>
<h1 id="1-브라우저-실행">1. 브라우저 실행</h1>
<p>driver = uc.Chrome()</p>
<h1 id="2-사이트-이동">2. 사이트 이동</h1>
<p>driver.get(&quot;<a href="https://www.gmarket.co.kr/n/best&quot;">https://www.gmarket.co.kr/n/best&quot;</a>)</p>
<h1 id="selenium으로-사이트를-이동-조작했을-때-컴퓨터로-인식해서-접근이-불가능-한-경우">selenium으로 사이트를 이동, 조작했을 때 컴퓨터로 인식해서 접근이 불가능 한 경우</h1>
<h1 id="감지가-되지-않는-브라우저를-사용">감지가 되지 않는 브라우저를 사용</h1>
<p>!pip install undetected-chromedriver</p>
<h1 id="iimport가-필요하다">iimport가 필요하다</h1>
<p>import undetected_chromedriver as uc</p>
<h1 id="4-첫번째-상품-클릭">4. 첫번째 상품 클릭</h1>
<p>title = driver.find_elements(By.CSS_SELECTOR,&quot;#container &gt; div.box__best-list &gt; ul &gt; li &gt; a&quot;)
title[0].click()</p>
<h1 id="5상품이름-상품가격">5.상품이름, 상품가격</h1>
<p>product = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &gt; div &gt; div.box__item-info &gt; h1&quot;)
price = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &gt; div &gt; div.box__price.price &gt; span:nth-child(2) &gt; strong&quot;)</p>
<h1 id="뒤로가기">뒤로가기</h1>
<p>driver.back()</p>
<h1 id="완성된-코드를-20번-반복하는-로직을-제작">완성된 코드를 20번 반복하는 로직을 제작</h1>
<p>product_list = []
price_list = []
for i in range(20) :
title = driver.find_elements(By.CSS_SELECTOR,&quot;#container &gt; div.box__best-list &gt; ul &gt; li &gt; a&quot;)
title[i].click()
time.sleep(1)
product = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &gt; div &gt; div.box__item-info &gt; h1&quot;)
try :
price = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &gt; div &gt; div.box__price.price &gt; span:nth-child(2) &gt; strong&quot;)
except :
price = driver.find_element(By.CSS_SELECTOR,&quot;#itemcase_basic &gt; div &gt; div.box__price.price &gt; span:nth-child(3) &gt; strong&quot;)
product_list.append(product.text)
price_list.append(price.text)
driver.back()
time.sleep(1)</p>
<p>driver.quit()</p>
<h1 id="이번-실습-정리">이번 실습 정리</h1>
<p>1) webdriver로 접근했을 때, 로봇이 감지 되는 경우 -&gt; uc 변경해서 사용하자
2) 반복할 코드를 먼저 작성해 본다</p>
<ul>
<li>반복할 코드를 먼저 작성해 본다</li>
<li>for문으로 감싸준다 -&gt; i의 위치만 지정한다(리스트의 인덱스 자리)</li>
<li>화면이 바뀌면, 태그를 다시 찾아야한다.</li>
<li>time을 요청이 발생할때마다 넣어준다.
3) 데이터를 수집할 때 화면마다 태그가 바뀐다면 예외처리(가격정보)</li>
<li>try : 오류 나기전의 시도할 코드</li>
<li>except : 오류 났을때 수집할 코드(정상가격)
4) 크롤링을 할 때는 화면의 크기 영향, 네트워크 상태도 영향</li>
<li>상황상황에 맞게 코드를 수정하는게 중요하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex06. 뉴스제목 수집]]></title>
            <link>https://velog.io/@sh_-s2/Ex06.-%EB%89%B4%EC%8A%A4%EC%A0%9C%EB%AA%A9-%EC%88%98%EC%A7%91</link>
            <guid>https://velog.io/@sh_-s2/Ex06.-%EB%89%B4%EC%8A%A4%EC%A0%9C%EB%AA%A9-%EC%88%98%EC%A7%91</guid>
            <pubDate>Wed, 26 Mar 2025 08:34:27 GMT</pubDate>
            <description><![CDATA[<p>Ex06. 뉴스제목수집 (실습)</p>
<h1 id="브라우저를-담당하는-라이브러리">브라우저를 담당하는 라이브러리</h1>
<p>from selenium import webdriver as wb</p>
<h1 id="선택자를-구분할-때-사용하는-라이브러리">선택자를 구분할 때 사용하는 라이브러리</h1>
<p>from selenium.webdriver.common.by import By</p>
<h1 id="컴퓨터용-키보드-엔터-del-end-기능을-가진-키를-입력">컴퓨터용 키보드 (엔터, del, end) 기능을 가진 키를 입력</h1>
<p>from selenium.webdriver.common.keys import Keys</p>
<p>#1. 브라우저 실행 -&gt; 네이버로 이동
driver = wb.Chrome()
driver.get(&quot;<a href="https://www.naver.com&quot;">https://www.naver.com&quot;</a>)</p>
<p>#2. 검색창에 산불 검색 -&gt; 엔터입력
search = driver.find_element(By.ID,&quot;query&quot;)
search.send_keys(&quot;산불&quot;)
search.send_keys(Keys.ENTER)</p>
<p>#3. 상단의 뉴스 탭 클릭
btc = driver.find_element(By.CSS_SELECTOR,&quot;#lnb &gt; div.lnb_group &gt; div &gt; div.lnb_nav_area._nav_area_root &gt; div &gt; div.api_flicking_wrap._conveyer_root &gt; div:nth-child(1) &gt; a&quot;)
btc.click()</p>
<p>#4. 페이지 맨 밑으로 3번 이동 -&gt; time.sleep() 활용하기
import time
body = driver.find_element(By.TAG_NAME,&quot;body&quot;)
for i in range(3) :
body.send_keys(Keys.END)
time.sleep(1)</p>
<p>#5. 뉴스 타이틀 수집 -&gt; 선택자 복수개로 수정하기
title = driver.find_elements(By.CSS_SELECTOR,&quot;div &gt; div &gt; div.news_contents &gt; a.news_tit&quot;)</p>
<p>#6. 컨텐츠(글자)만 저장하는 리스트 제작
title_list = []
for i in range(len(title)) :
title_list.append(title[i].text)</p>
<p>print(len(title_list))
title_list</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex05.한솥도시락]]></title>
            <link>https://velog.io/@sh_-s2/Ex05.%ED%95%9C%EC%86%A5%EB%8F%84%EC%8B%9C%EB%9D%BD</link>
            <guid>https://velog.io/@sh_-s2/Ex05.%ED%95%9C%EC%86%A5%EB%8F%84%EC%8B%9C%EB%9D%BD</guid>
            <pubDate>Wed, 26 Mar 2025 08:33:32 GMT</pubDate>
            <description><![CDATA[<p>Ex05 한솥도시락</p>
<p>from selenium import webdriver as wb
from selenium.webdriver.common.by import By</p>
<p>driver = wb.Chrome()</p>
<p>driver.get(&quot;<a href="https://www.hsd.co.kr/menu/menu_list&quot;">https://www.hsd.co.kr/menu/menu_list&quot;</a>)</p>
<h1 id="상품이름-수집">상품이름 수집</h1>
<p>title = driver.find_elements(By.CSS_SELECTOR,&quot;div &gt; div.item-text &gt; h4&quot;)</p>
<h1 id="상품가격-수집">상품가격 수집</h1>
<p>price = driver.find_elements(By.CSS_SELECTOR,&quot;div &gt; div.item-text &gt; div &gt; strong&quot;)</p>
<h1 id="상품정보를-받아오기-위해서-더보기-버튼-클릭">상품정보를 받아오기 위해서 더보기 버튼 클릭</h1>
<p>btn = driver.find_element(By.CSS_SELECTOR,&quot;#btn_more &gt; span &gt; a&quot;)</p>
<p>btn.click()</p>
<p>title</p>
<h1 id="모든-데이터를-불러오기-위해서-더보기-버튼-반복-클릭">모든 데이터를 불러오기 위해서 더보기 버튼 반복 클릭</h1>
<p>btn = driver.find_element(By.CSS_SELECTOR,&quot;#btn_more &gt; span &gt; a&quot;)
for i in range(10) :
btn.click()</p>
<h1 id="예외처리">예외처리</h1>
<h1 id="목적--코드를-시도-하다가-에러예외가-발생-할때는-다른-코드를-실행하겠다">목적 : 코드를 시도 하다가, 에러(예외)가 발생 할때는 다른 코드를 실행하겠다.</h1>
<h1 id="try--코드를-에러-나기-전까지-실행할-영역">try : 코드를 에러 나기 전까지 실행할 영역</h1>
<h1 id="except--에러가-났을-때-실행할-영역">except : 에러가 났을 때 실행할 영역</h1>
<h1 id="데이터를-수집할-때-예외처리를-하는-경우-반드시-데이터가-없다면-null로-대체하자">데이터를 수집할 때 예외처리를 하는 경우 반드시 데이터가 없다면 null로 대체하자</h1>
<p>try :
btn = driver.find_element(By.CSS_SELECTOR,&quot;#btn_more &gt; span &gt; a&quot;)
for i in range(10) :
btn.click()
except :
print(&quot;더보기 완료!&quot;)</p>
<h1 id="코드-중간에-쉬는-시간을-부여하는-라이브러리-time">코드 중간에 쉬는 시간을 부여하는 라이브러리 time</h1>
<h1 id="목적--클라이언트가-서버에게-데이터를-요청했을때-응답-받는-동안-시간을-부여">목적 : 클라이언트가 서버에게 데이터를 요청했을때, 응답 받는 동안 시간을 부여</h1>
<h1 id="사용법--요청이-발생-할-때마다-시간을-부여한다">사용법 : 요청이 발생 할 때마다, 시간을 부여한다.</h1>
<p>import time</p>
<p>driver = wb.Chrome()
driver.get(&quot;<a href="https://www.hsd.co.kr/menu/menu_list&quot;">https://www.hsd.co.kr/menu/menu_list&quot;</a>)</p>
<p>try :
btn = driver.find_element(By.CSS_SELECTOR,&quot;#btn_more &gt; span &gt; a&quot;)
for i in range(20) :
btn.click()
time.sleep(1)
except :
print(&quot;더보기 완료!&quot;)</p>
<p>title = driver.find_elements(By.CSS_SELECTOR,&quot;div &gt; div.item-text &gt; h4&quot;)
price = driver.find_elements(By.CSS_SELECTOR,&quot;div &gt; div.item-text &gt; div&quot;)</p>
<p>title_list = []
price_list = []
for i in range(len(title)) :
title_list.append(title[i].text)
price_list.append(price[i].text)</p>
<p>print(len(title_list))
print(len(price_list))</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex04. Selenium 조작법]]></title>
            <link>https://velog.io/@sh_-s2/Ex04.-Selenium-%EC%A1%B0%EC%9E%91%EB%B2%95</link>
            <guid>https://velog.io/@sh_-s2/Ex04.-Selenium-%EC%A1%B0%EC%9E%91%EB%B2%95</guid>
            <pubDate>Wed, 26 Mar 2025 03:48:18 GMT</pubDate>
            <description><![CDATA[<h1 id="selenium-라이브러리">Selenium 라이브러리</h1>
<ul>
<li>파이썬으로 브라우저를 조작하는 라이브러리</li>
<li>사람이 하는 모든 행위를 똑같이 만들 수 있는 라이브러리</li>
<li>주의점! 반드시 사람처럼 동작할 수 있게 코드를 작성해야 한다.</li>
<li>주의점! 명령을 내릴 때는 하나하나 친절하게 알려줘야 한다.</li>
</ul>
<h1 id="selenium은-반드시-한번-설치가-필요하다">selenium은 반드시 한번 설치가 필요하다.</h1>
<p>!pip install selenium</p>
<h1 id="브라우저를-담당하는-라이브러리">브라우저를 담당하는 라이브러리</h1>
<p>from selenium import webdriver as wb</p>
<h1 id="선택자를-구분할-때-사용하는-라이브러리">선택자를 구분할 때 사용하는 라이브러리</h1>
<p>from selenium.webdriver.common.by import By</p>
<h1 id="컴퓨터용-키보드-엔터-del-end-기능을-가진-키를-입력">컴퓨터용 키보드 (엔터, del, end) 기능을 가진 키를 입력</h1>
<p>from selenium.webdriver.common.keys import Keys</p>
<p>#1. 크롬창을 실행</p>
<h1 id="구버전--소괄호-안에-크롬드라이버의-경로를-작성">구버전 : 소괄호 안에 크롬드라이버의 경로를 작성</h1>
<h1 id="신버전--자동으로-설치">신버전 : 자동으로 설치</h1>
<p>driver = wb.Chrome()</p>
<p>#2. 사이트로 이동</p>
<h1 id="대화--driver에게-네이버사이트-가져와">대화 : driver에게 네이버사이트 가져와!</h1>
<p>driver.get(&quot;<a href="http://www.naver.com&quot;">http://www.naver.com&quot;</a>)</p>
<h1 id="req로-데이터를-받아올-때는-bs이-필수---text---html-바꾸기-위해서">req로 데이터를 받아올 때는 bs이 필수 -&gt; text -&gt; HTML 바꾸기 위해서</h1>
<h1 id="그러나-driver는-가지고-있는-데이터가-html---bs이-필요하지-않다">그러나! driver는 가지고 있는 데이터가 HTML -&gt; bs이 필요하지 않다.</h1>
<h1 id="3-검색창에-검색어-입력">3. 검색창에 검색어 입력</h1>
<h1 id="키포인트--명령을-내릴-대상을-찾은-후---명령을-실행">키포인트 : 명령을 내릴 대상을 찾은 후 -&gt; 명령을 실행</h1>
<h1 id="대화--driver에게-요소를-찾아줘-아이디가-query인-요소를-찾겠다">대화 : driver에게 요소를 찾아줘! 아이디가 #query인 요소를 찾겠다.</h1>
<h1 id="구버전--driverfind_element_by_idquery">구버전 : driver.find_element_by_id(&quot;query&quot;)</h1>
<p>search = driver.find_element(By.ID,&quot;query&quot;)</p>
<h1 id="search에게-강아지값을-보내준다">search에게 &quot;강아지&quot;값을 보내준다.</h1>
<h1 id="특정-요소에게-값을-보낼때검색---send_keys">특정 요소에게 값을 보낼때(검색) -&gt; send_keys</h1>
<p>search.send_keys(&quot;강아지&quot;)</p>
<h1 id="search에게-키보드에-있는-엔터를-보내준다">search에게 키보드에 있는 엔터를 보내준다.</h1>
<p>search.send_keys(Keys.ENTER)</p>
<h1 id="5-화면을-맨-밑으로-이동---데이터를-더-많이-받기위해서">5. 화면을 맨 밑으로 이동 -&gt; 데이터를 더 많이 받기위해서</h1>
<h1 id="대화--body태그에게-키보드에-있는-end-값을-보내줘">대화 : body태그에게 키보드에 있는 END 값을 보내줘!</h1>
<p>body = driver.find_element(By.TAG_NAME,&quot;body&quot;)
body.send_keys(Keys.END)</p>
<p>#6. 페이지 뒤로가기
driver.back()</p>
<p>#7. 검색창에 고양이 검색</p>
<h1 id="키포인트--화면이-바껴서-다른-페이지로-이동하면-기존-데이터가-증발">키포인트 : 화면이 바껴서 다른 페이지로 이동하면, 기존 데이터가 증발</h1>
<h1 id="다시-요소를-찾는-행위를-반드시-해줘야한다">다시 요소를 찾는 행위를 반드시 해줘야한다.</h1>
<p>search = driver.find_element(By.ID,&quot;query&quot;)
search.send_keys(&quot;고양이&quot;)
search.send_keys(Keys.ENTER)</p>
<p>#8. 텍스트 수집
cat = driver.find_elements(By.CSS_SELECTOR,&quot;#mflick &gt; div &gt; div &gt; ul &gt; li &gt; div &gt; div &gt; strong &gt; a&quot;)</p>
<p>#9. 텍스트만 추출후 저장
name_list = []
for i in cat :
    name_list.append(i.text)
name_list</p>
<h1 id="10-창-종료">10. 창 종료</h1>
<h1 id="2가지-방법-close-vs-quit">2가지 방법 close vs quit</h1>
<h1 id="close--열려있는-탭만-종료">close : 열려있는 탭만 종료</h1>
<h1 id="quit--전체-브라우저를-종료">quit : 전체 브라우저를 종료</h1>
<p>driver.quit()</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ex03 환율정보]]></title>
            <link>https://velog.io/@sh_-s2/Ex03-%ED%99%98%EC%9C%A8%EC%A0%95%EB%B3%B4</link>
            <guid>https://velog.io/@sh_-s2/Ex03-%ED%99%98%EC%9C%A8%EC%A0%95%EB%B3%B4</guid>
            <pubDate>Tue, 25 Mar 2025 09:05:47 GMT</pubDate>
            <description><![CDATA[<p>import requests as req
from bs4 import BeautifulSoup as bs</p>
<p>res = req.get(&quot;<a href="https://finance.naver.com/marketindex/exchangeList.naver&quot;">https://finance.naver.com/marketindex/exchangeList.naver&quot;</a>)</p>
<p>soup = bs(res.text, &quot;lxml&quot;)</p>
<p>soup.select(&quot;body &gt; div &gt; table &gt; tbody &gt; tr &gt; td.tit &gt; a&quot;)</p>
<h1 id="이번-실습-2가지-포인트">이번 실습 2가지 포인트</h1>
<p>1) req로 데이터를 요청했을 때 200이 나오더라도 수집이 안되는 경우 발생
    - iframe태그를 의심하자
    - iframe = 다른 서버에 저장된 정보를 빌려다가 보여주는 태그(접근이 불가능)
    - 원본데이터를 가져오는 방법 = iframe속 src값을 집중하자
    - 상대경로 vs 절대경로
    - 상대경로인 경우에는 반드시 절대경로로 수정해야 한다.
    - 수정한 경로로 데이터를 재요청 해야한다.
2) 선택자를 복사하는 방법
    - 개발자 도구에서 태그위에 우클릭 -&gt; copy -&gt; copyselctor
    - 주의점 : 오직 내가 선택한 태그 한개만 가지고 오는 단수선택자
    - 활용법 : 복수개의 데이터가 필요하다면, 선택자를 수정해라.
    - 수정법 : 선택자의 뒤에서부터 단수를 의미하는걸 지우자 (id, nth-child)</p>
]]></description>
        </item>
    </channel>
</rss>