<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cd-record 님의 블로그</title>
    <link>https://cd-record.tistory.com/</link>
    <description>cd-record 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 08:57:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>cd-record</managingEditor>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.24) KNN 알고리즘,  GridSearchCV</title>
      <link>https://cd-record.tistory.com/71</link>
      <description>&lt;h2 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h2 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;KNN 알고리즘&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;/i&gt;데이터로부터 거리가 가까운 'k'개의 다른 데이터의 레이블을 참조하여 분류하는 알고리즘 (지도학습)&lt;/p&gt;
&lt;h3 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;핵심 원리&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;동작 방식:&lt;/b&gt; 새로운 데이터가 들어왔을 때, 기존에 학습된 데이터 중 가장 가까운 거리의 데이터 &lt;b data-index-in-node=&quot;53&quot; data-path-to-node=&quot;4,0,0&quot;&gt;K개&lt;/b&gt;를 찾습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;분류(Classification):&lt;/b&gt; 가장 많이 뽑힌(다수결) 클래스로 새로운 데이터를 분류합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;회귀(Regression):&lt;/b&gt; 가장 가까운 K개 데이터들의 평균값을 새로운 데이터의 값으로 예측합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rskhf/dJMcahSnzSF/wL5oV3ZoKq7szPikuOZkK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rskhf/dJMcahSnzSF/wL5oV3ZoKq7szPikuOZkK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rskhf/dJMcahSnzSF/wL5oV3ZoKq7szPikuOZkK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frskhf%2FdJMcahSnzSF%2FwL5oV3ZoKq7szPikuOZkK1%2Fimg.png&quot; onerror=&quot;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';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;147&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size18&quot;&gt;K값에 따른 결과 변화&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;Case 1: K = 3 일 때&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;가장 가까운 3개를 찾았더니 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;9&quot;&gt;[●, ●, ▲]&lt;/b&gt; 가 나왔습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;결과:&lt;/b&gt; 다수결에 따라 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;10,0,0&quot;&gt;A그룹&lt;/b&gt;으로 분류합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;Case 2: K = 7 일 때&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;가장 가까운 7개를 찾았더니 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;12&quot;&gt;[●, ●, ▲, ▲, ▲, ▲, ▲]&lt;/b&gt; 가 나왔습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;결과:&lt;/b&gt; 다수결에 따라 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;13,0,0&quot;&gt;B그룹&lt;/b&gt;으로 분류합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 거리를 재는 방법 (시각화)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터들 사이의 거리를 계산할 때는 주로 유클리드 거리 공식 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xK0l8/dJMcaglE9Sw/IPHT5h4XBGRGy2KN1lski0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xK0l8/dJMcaglE9Sw/IPHT5h4XBGRGy2KN1lski0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xK0l8/dJMcaglE9Sw/IPHT5h4XBGRGy2KN1lski0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxK0l8%2FdJMcaglE9Sw%2FIPHT5h4XBGRGy2KN1lski0%2Fimg.png&quot; onerror=&quot;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';&quot; loading=&quot;lazy&quot; width=&quot;401&quot; height=&quot;63&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* K의 개수는 짝수가 아닌 홀수로 하는 것이 좋다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;만약, K개가 짝수일 경우 아래와 같이 2:2 동점 상황이 만들어져서 A를 분류할 수 없는 경우가 발생할 수 있기 때문이다.&lt;/blockquote&gt;
&lt;h3 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;K-NN 알고리즘의 장/단점&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;단순하고 효율적이다.&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;모델을 생성하지 않아 특징과 클래스 간 관계를 이해하는 데 제한적이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;기저 데이터 분포에 대한 가정을 하지 않는다.&lt;br /&gt;(기저 데이터: 특정 분석, 모델링, 또는 변환 작업의 바탕이 되는 기준 원본 데이터)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;적절한 k의 선택이 필요하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;훈련 단계가 빠르다.&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;데이터가 많아지면 분류 단계가 느리다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;수치 기반 데이터 분류 작업에서 성능이 우수하다.&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;명목 특징 및 누락 데이터를 위한 추가 처리가 필요하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;GridSearchCV&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사이킷런에서 교차 검증을 기반으로 하이퍼파라미터의 최적값을 찾을 수 있는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(최적의 하이퍼파라미터 조합을 찾는자동화된 방법)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 하이퍼파라미터(Hyperparameter): 머신러닝이나 딥러닝 모델을 훈련할 때, 사용자가 직접 사전에 설정해야하는 변수값&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사용 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;모델마다 우리가 직접 설정해야 하는 값(하이퍼파라미터)이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;KNN 알고리즘 예시:&lt;/b&gt; &quot;K를 몇으로 할까?&quot; (K=1, 3, 5, 7...)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;의사결정나무 예시:&lt;/b&gt; &quot;나무의 깊이(depth)는 얼마나 깊게 할까?&quot; (깊이=3, 5, 10...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size18&quot;&gt;이 값들을 감으로 찍는 것이 아니라, 컴퓨터가 수학적으로 가장 점수가 높은 조합을 찾게 만드는 것입니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;작동 방식&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size18&quot;&gt;마치 격자(Grid) 모양의 표를 만들어 모든 칸을 탐색하는 것과 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;10&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;파라미터 A=1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;파라미터 A=2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;파라미터 A=3&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0,0&quot;&gt;파라미터 B=10&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,1,1,0&quot;&gt;성능 0.75&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,1,2,0&quot;&gt;성능 0.82&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,1,3,0&quot;&gt;성능 0.78&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0,0&quot;&gt;파라미터 B=20&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,2,1,0&quot;&gt;성능 0.85&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,2,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,2,0&quot;&gt;성능 0.91 (최고)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;10,2,3,0&quot;&gt;성능 0.88&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;Grid 정의:&lt;/b&gt; 테스트하고 싶은 파라미터들의 후보군을 정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;모든 조합 생성:&lt;/b&gt; 위 표처럼 가능한 모든 경우의 수를 만듭니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;Cross-Validation(교차 검증) 수행:&lt;/b&gt; 각 조합마다 데이터를 여러 조각으로 나누어(K-Fold) 학습과 검증을 반복합니다. 이를 통해 특정 데이터에만 과적합되는 것을 방지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,3,0&quot;&gt;최적 조합 선택:&lt;/b&gt; 평균 성능이 가장 높은 조합을 최종 모델의 파라미터로 선택합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;GridSearchCV의 장/단점&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;철저함&lt;/b&gt;: 범위 내의 모든 조합을 확인하므로 이론상 가장 좋은 성능을 낼 수 있다.&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;시간 소모&lt;/b&gt;: 파라미터 조합이 많아질수록 연산량이 기하급수적으로 늘어난다. (학습 시간이 오래걸릴 수 있음.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;편의성&lt;/b&gt;: 한 번 설정해두면 컴퓨터가 알아서 최적의 값을 찾는다.&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;177&quot; data-start=&quot;151&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;머신러닝 파이프라인 및 응용 구현 실습 정리&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;전체 흐름&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;데이터 준비 &amp;rarr; 전처리 &amp;rarr; 모델 학습 &amp;rarr; 하이퍼파라미터 튜닝 &amp;rarr; 모델 저장 &amp;rarr; 신규 데이터 예측 &amp;rarr; API 서비스&lt;/blockquote&gt;
&lt;h3 data-end=&quot;212&quot; data-start=&quot;179&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;212&quot; data-start=&quot;179&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Iris 데이터셋을 이용한 KNN 분류 모델 학습&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;229&quot; data-start=&quot;214&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 데이터 로드&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;역할: Iris 데이터셋 가져오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;X&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;408&quot; data-start=&quot;315&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;꽃받침 길이&lt;/td&gt;
&lt;td&gt;꽃받침 너비&lt;/td&gt;
&lt;td&gt;꽃잎 길이&lt;/td&gt;
&lt;td&gt;꽃잎 너비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;408&quot; data-start=&quot;391&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;395&quot; data-start=&quot;391&quot;&gt;5.1&lt;/td&gt;
&lt;td data-end=&quot;399&quot; data-start=&quot;395&quot; data-col-size=&quot;sm&quot;&gt;3.5&lt;/td&gt;
&lt;td data-end=&quot;403&quot; data-start=&quot;399&quot; data-col-size=&quot;sm&quot;&gt;1.4&lt;/td&gt;
&lt;td data-end=&quot;408&quot; data-start=&quot;403&quot; data-col-size=&quot;sm&quot;&gt;0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;y&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;정답(Label)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;0 = setosa
1 = versicolor
2 = virginica&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 학습 데이터와 테스트 데이터 분할&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;591&quot; data-start=&quot;582&quot; data-ke-size=&quot;size18&quot;&gt;주요 옵션&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;옵션의미
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 66px;&quot; border=&quot;1&quot; data-end=&quot;715&quot; data-start=&quot;593&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;715&quot; data-start=&quot;625&quot;&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;660&quot; data-start=&quot;625&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;641&quot; data-start=&quot;625&quot;&gt;test_size=0.2&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-end=&quot;660&quot; data-start=&quot;641&quot; data-col-size=&quot;sm&quot;&gt;학습 80%, 테스트 20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;688&quot; data-start=&quot;661&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;679&quot; data-start=&quot;661&quot;&gt;random_state=42&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-end=&quot;688&quot; data-start=&quot;679&quot; data-col-size=&quot;sm&quot;&gt;결과 재현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;715&quot; data-start=&quot;689&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;702&quot; data-start=&quot;689&quot;&gt;stratify=y&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-end=&quot;715&quot; data-start=&quot;702&quot; data-col-size=&quot;sm&quot;&gt;클래스 비율 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;735&quot; data-start=&quot;717&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;* stratify 사용 이유&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;764&quot; data-start=&quot;737&quot; data-ke-size=&quot;size16&quot;&gt;Iris 데이터는 각 클래스가 50개씩 존재한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;setosa      50
versicolor  50
virginica   50&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;844&quot; data-start=&quot;820&quot; data-ke-size=&quot;size16&quot;&gt;분할 후에도 비슷한 비율이 유지되도록 한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;Train
40 / 40 / 40

Test
10 / 10 / 10&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;920&quot; data-start=&quot;898&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터 정규화 (Scaling)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;932&quot; data-start=&quot;922&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 왜 필요한가?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;952&quot; data-start=&quot;934&quot; data-ke-size=&quot;size16&quot;&gt;KNN은 거리 기반 알고리즘이다.&lt;/p&gt;
&lt;p data-end=&quot;956&quot; data-start=&quot;954&quot; data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;꽃받침 길이 : 7.0
꽃잎 너비 : 0.2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1025&quot; data-start=&quot;992&quot; data-ke-size=&quot;size16&quot;&gt;값의 범위 차이가 크면 큰 값이 거리에 더 큰 영향을 준다.&lt;/p&gt;
&lt;p data-end=&quot;1052&quot; data-start=&quot;1027&quot; data-ke-size=&quot;size16&quot;&gt;따라서 모든 특징을 같은 범위로 맞춰야 한다.&lt;/p&gt;
&lt;h4 data-end=&quot;1077&quot; data-start=&quot;1059&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 학습 데이터(MinMaxScaler 사용)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;scaler = MinMaxScaler()

X_train_scaled = scaler.fit_transform(X_train)

X_test_scaled = scaler.transform(X_test)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px;&quot;&gt;fit&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1228&quot; data-start=&quot;1217&quot; data-ke-size=&quot;size18&quot;&gt;최소값과 최대값 계산&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;min
max&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1260&quot; data-start=&quot;1247&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;transform&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1270&quot; data-start=&quot;1262&quot; data-ke-size=&quot;size18&quot;&gt;다음 공식 적용&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;(x - min) / (max - min)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1310&quot; data-start=&quot;1305&quot; data-ke-size=&quot;size16&quot;&gt;결과 범위&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;0 ~ 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* test 데이터 fit_transform 안하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782299530514&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X_test_scaled = scaler.fit_transform(X_test)​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 데이터의 최소/최대값을 보고 학습하게 됨(즉, 시험지를 미리 보고 공부 하는 꼴)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이를 &lt;span style=&quot;color: #ee2323;&quot;&gt;데이터 누수 (Data Leakage)&lt;/span&gt; 라고 함.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;KNN 생성&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1782299757350&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;knn = KNeighborsClassifier()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1559&quot; data-start=&quot;1525&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;1599&quot; data-start=&quot;1566&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;GridSearchCV를 이용한 하이퍼파라미터 튜닝&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1619&quot; data-start=&quot;1601&quot; data-ke-size=&quot;size18&quot;&gt;KNN의 주요 하이퍼파라미터&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;n_neighbors&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1650&quot; data-start=&quot;1648&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;몇 개의 이웃을 참고할 것인가?&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1692&quot; data-start=&quot;1684&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 후보 생성&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;matlab&quot;&gt;&lt;code&gt;param_grid = {
    'n_neighbors': [i for i in range(1,31) if i % 2 != 0]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1786&quot; data-start=&quot;1784&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1908&quot; data-start=&quot;1895&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;1930&quot; data-start=&quot;1915&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. GridSearchCV&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;grid_search = GridSearchCV(
    knn,
    param_grid,
    cv=5,
    scoring='accuracy',
    n_jobs=-1
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2059&quot; data-start=&quot;2050&quot; data-ke-size=&quot;size18&quot;&gt;옵션 설명&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2173&quot; data-start=&quot;2061&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2173&quot; data-start=&quot;2093&quot;&gt;
&lt;tr data-end=&quot;2115&quot; data-start=&quot;2093&quot;&gt;
&lt;td style=&quot;width: 21.6279%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2100&quot; data-start=&quot;2093&quot;&gt;cv=5&lt;/td&gt;
&lt;td style=&quot;width: 78.2558%;&quot; data-end=&quot;2115&quot; data-start=&quot;2100&quot; data-col-size=&quot;sm&quot;&gt;5-Fold 교차검증&lt;br /&gt;(전체 데이터를 5개의 그룹으로 쪼갠 뒤, 학습과 검증을 총 5번 반복)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2147&quot; data-start=&quot;2116&quot;&gt;
&lt;td style=&quot;width: 21.6279%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2137&quot; data-start=&quot;2116&quot;&gt;scoring='accuracy'&lt;/td&gt;
&lt;td style=&quot;width: 78.2558%;&quot; data-end=&quot;2147&quot; data-start=&quot;2137&quot; data-col-size=&quot;sm&quot;&gt;정확도 평가(&quot;정확도&quot;라는 지표를 기준한다는 의미)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2173&quot; data-start=&quot;2148&quot;&gt;
&lt;td style=&quot;width: 21.6279%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2160&quot; data-start=&quot;2148&quot;&gt;n_jobs=-1&lt;/td&gt;
&lt;td style=&quot;width: 78.2558%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2173&quot; data-start=&quot;2160&quot;&gt;모든 CPU 사용&lt;br /&gt;(컴퓨터의 모든 CPU 코어를 동시에 사용하여 병렬 연산을 수행합니다. &lt;br /&gt;그리드 서치는 탐색할 조합이 많아 시간이 오래 걸리는데 이 옵션을 쓰면 연산 속도가 극대화됩니다.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2387&quot; data-start=&quot;2374&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;학습&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1782300455474&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grid_search.fit(X_train_scaled, y_train)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제 과정&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;K=1 학습 &lt;br /&gt;&amp;darr; &lt;br /&gt;정확도 측정 &lt;br /&gt;&lt;br /&gt;K=3 학습 &lt;br /&gt;&amp;darr; &lt;br /&gt;정확도 측정 &lt;br /&gt;&lt;br /&gt;K=5 학습 &lt;br /&gt;&amp;darr; &lt;br /&gt;정확도 측정 &lt;br /&gt;...&lt;/blockquote&gt;
&lt;p data-end=&quot;2387&quot; data-start=&quot;2374&quot; data-ke-size=&quot;size18&quot;&gt;그 후 가장 높은 정확도 선택&lt;/p&gt;
&lt;h3 data-end=&quot;2387&quot; data-start=&quot;2374&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;최적 모델 평가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최고 성능 모델 추출&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;best_model = grid_search.best_estimator_&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2465&quot; data-start=&quot;2463&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2465&quot; data-start=&quot;2463&quot; data-ke-size=&quot;size16&quot;&gt;예측(테스트)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;y_pred = best_model.predict(X_test_scaled)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2527&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size16&quot;&gt;평가&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;print(f&quot;최종 테스트 데이터 정확도: {accuracy_score(y_test, y_pred):.4f}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2581&quot; data-start=&quot;2575&quot; data-ke-size=&quot;size16&quot;&gt;정확도 계산&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;정답 개수
-------------
전체 개수&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2640&quot; data-start=&quot;2623&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;모델 저장 및 불러오기&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;2653&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 왜 저장하는가?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2670&quot; data-start=&quot;2655&quot; data-ke-size=&quot;size16&quot;&gt;학습은 시간이 오래 걸린다.&lt;/p&gt;
&lt;p data-end=&quot;2706&quot; data-start=&quot;2672&quot; data-ke-size=&quot;size16&quot;&gt;서비스 시에는 학습을 다시 하지 않고 저장된 모델을 사용한다.&lt;/p&gt;
&lt;h4 data-end=&quot;2718&quot; data-start=&quot;2713&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2 .저장&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;joblib.dump(best_model, 'best_model.joblib')

joblib.dump(scaler,scaler.scaler')&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;2713&quot; data-end=&quot;2718&quot;&gt;&lt;b&gt;3. 모델 불러오기&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;model = joblib.load('best_model.joblib')
scaler = joblib.load('scaler.scaler')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3136&quot; data-start=&quot;3122&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;신규 데이터 생성 ~ 예측&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;3150&quot; data-start=&quot;3138&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 신규 데이터 생성&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;new_data = pd.DataFrame({
    ...
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3223&quot; data-start=&quot;3209&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 스케일링 수행 (반드시)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;new_data_scaled = scaler.transform(new_data)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3293&quot; data-start=&quot;3291&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;주의&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;fit_transform()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3335&quot; data-start=&quot;3326&quot; data-ke-size=&quot;size16&quot;&gt;사용하면 안 됨.&lt;/p&gt;
&lt;p data-end=&quot;3367&quot; data-start=&quot;3337&quot; data-ke-size=&quot;size16&quot;&gt;학습 시 계산한 min/max를 그대로 사용해야 한다.&lt;/p&gt;
&lt;h4 data-end=&quot;3367&quot; data-start=&quot;3337&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 예측&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;predictions = model.predict(new_data)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3449&quot; data-start=&quot;3447&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[1, 0]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3469&quot; data-start=&quot;3467&quot; data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;1 &amp;rarr; versicolor
0 &amp;rarr; setosa&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3533&quot; data-start=&quot;3511&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Flask 기반 머신러닝 API&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;라이브러리 불러오기 및 플라스크&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1782347982155&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import joblib
import numpy as np
from flask import Flask, request, jsonify

app = Flask(__name__)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-end=&quot;3630&quot; data-start=&quot;3622&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 모델 로드&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;model = joblib.load('best_model.joblib')

scaler = joblib.load('scaler.joblib')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3754&quot; data-start=&quot;3739&quot; data-ke-size=&quot;size18&quot;&gt;서버 시작 시 한 번만 로드&lt;/p&gt;
&lt;h4 data-end=&quot;3775&quot; data-start=&quot;3761&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. POST 요청만 허용&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;@app.route('/predict',methods=['POST'])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;3761&quot; data-end=&quot;3775&quot;&gt;&lt;b&gt;3. JSON 데이터 받기&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;data = request.get_json()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3907&quot; data-start=&quot;3905&quot; data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;features&quot;: [5.1,3.5,1.4,0.2]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3974&quot; data-start=&quot;3965&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 유효성 검사&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;if not data or 'features' not in data:
	return jsonify({'error': 'JSON 데이터에 &quot;features&quot; 키가 필요합니다.'}), 400&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;4131&quot; data-start=&quot;4116&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 모델 입력 형식 맞추기(2차원 배열 반환)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;4135&quot; data-start=&quot;4133&quot; data-ke-size=&quot;size18&quot;&gt;입력 데이터 추출&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;features = data['features']

[5.1,3.5,1.4,0.2]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4175&quot; data-start=&quot;4170&quot; data-ke-size=&quot;size18&quot;&gt;모델 입력&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;input_data = np.array([features])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4214&quot; data-start=&quot;4212&quot; data-ke-size=&quot;size16&quot;&gt;변환&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;[[5.1,3.5,1.4,0.2]]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. 스케일링(정규화)&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;scaled_data = scaler.transform(input_data)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7. 예측&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;prediction = model.predict(scaled_data)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;4496&quot; data-start=&quot;4488&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;8. 확률 계산&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;probability = model.predict_proba(scaled_data)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4568&quot; data-start=&quot;4566&quot; data-ke-size=&quot;size16&quot;&gt;예)&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[[0.98,0.01,0.01]]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;4618&quot; data-start=&quot;4609&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;9. JSON 응답 반환 신뢰도 추출&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;result = {
    &quot;prediction_index&quot;: 0,
    &quot;prediction_label&quot;: &quot;setosa&quot;,
    &quot;confidence&quot;: float(np.max(probability)
    # 신뢰도 추출: np.max(probability) =&amp;gt; 0.98
}

return jsonify(result), 200&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/71</guid>
      <comments>https://cd-record.tistory.com/71#entry71comment</comments>
      <pubDate>Wed, 24 Jun 2026 19:02:27 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.23) 머신러닝, (의사결정나무알고리즘)</title>
      <link>https://cd-record.tistory.com/70</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
머신러닝&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝(Machine Leraning)이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;머신러닝은 사람이 공부를 통해 지식을 습득하듯이, 컴퓨터에게 데이터를 제공하여 스스로 규칙을 학습하게 만드는 기술&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝과 전통적 프로그래밍의 차이점&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;전통적 프로그래밍&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;입력&amp;nbsp;데이터 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;프로그램(규칙) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;결과&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;머신러닝&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;데이터&amp;nbsp;+&amp;nbsp;정답 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;머신러닝&amp;nbsp;학습 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;모델&amp;nbsp;생성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;새로운&amp;nbsp;데이터&amp;nbsp;입력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;예측&amp;nbsp;결과&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 지도학습(Supervised Learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정답이 있는 데이터를 학습하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1147&quot; data-start=&quot;1140&quot; data-ke-size=&quot;size18&quot;&gt;대표 알고리즘&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1182&quot; data-start=&quot;1149&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1157&quot; data-start=&quot;1149&quot;&gt;의사결정나무&lt;/li&gt;
&lt;li data-end=&quot;1167&quot; data-start=&quot;1158&quot;&gt;로지스틱 회귀&lt;/li&gt;
&lt;li data-end=&quot;1173&quot; data-start=&quot;1168&quot;&gt;SVM&lt;/li&gt;
&lt;li data-end=&quot;1182&quot; data-start=&quot;1174&quot;&gt;랜덤포레스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1189&quot; data-start=&quot;1184&quot; data-ke-size=&quot;size18&quot;&gt;사용 예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1219&quot; data-start=&quot;1191&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1200&quot; data-start=&quot;1191&quot;&gt;스팸메일 분류&lt;/li&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1201&quot;&gt;질병 진단&lt;/li&gt;
&lt;li data-end=&quot;1219&quot; data-start=&quot;1209&quot;&gt;주택 가격 예측&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1260&quot; data-start=&quot;1226&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 비지도학습(Unsupervised Learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1285&quot; data-start=&quot;1262&quot; data-ke-size=&quot;size18&quot;&gt;정답이 없는 데이터를 학습하는 방식&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;20대 여성 그룹
30대 직장인 그룹
고가 제품 선호 그룹&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;대표 알고리즘&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1407&quot; data-start=&quot;1383&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1392&quot; data-start=&quot;1383&quot;&gt;K-Means&lt;/li&gt;
&lt;li data-end=&quot;1401&quot; data-start=&quot;1393&quot;&gt;DBSCAN&lt;/li&gt;
&lt;li data-end=&quot;1407&quot; data-start=&quot;1402&quot;&gt;PCA&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1414&quot; data-start=&quot;1409&quot; data-ke-size=&quot;size18&quot;&gt;사용 예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1441&quot; data-start=&quot;1416&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1424&quot; data-start=&quot;1416&quot;&gt;고객 세분화&lt;/li&gt;
&lt;li data-end=&quot;1432&quot; data-start=&quot;1425&quot;&gt;군집 분석&lt;/li&gt;
&lt;li data-end=&quot;1441&quot; data-start=&quot;1433&quot;&gt;이상치 탐지&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 3. 강화학습(Reinforcement Learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보상(Reward)을 통해 학습하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1514&quot; data-start=&quot;1512&quot; data-ke-size=&quot;size18&quot;&gt;예시&lt;/p&gt;
&lt;p data-end=&quot;1536&quot; data-start=&quot;1516&quot; data-ke-size=&quot;size18&quot;&gt;게임 AI가 있다고 가정&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;이기면 +10점
지면 -10점&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1598&quot; data-start=&quot;1568&quot; data-ke-size=&quot;size18&quot;&gt;AI는 높은 점수를 얻기 위해 행동을 계속 수정합니다.&lt;/p&gt;
&lt;p data-end=&quot;1605&quot; data-start=&quot;1600&quot; data-ke-size=&quot;size18&quot;&gt;사용 예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1629&quot; data-start=&quot;1607&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1613&quot; data-start=&quot;1607&quot;&gt;자율주행&lt;/li&gt;
&lt;li data-end=&quot;1621&quot; data-start=&quot;1614&quot;&gt;게임 AI&lt;/li&gt;
&lt;li data-end=&quot;1629&quot; data-start=&quot;1622&quot;&gt;로봇 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;1660&quot; data-start=&quot;1636&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 딥러닝(Deep Learning)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1708&quot; data-start=&quot;1662&quot; data-ke-size=&quot;size18&quot;&gt;인간의 뇌를 모방한 신경망(Neural Network)을 이용하는 학습 방법&lt;/p&gt;
&lt;p data-end=&quot;1715&quot; data-start=&quot;1710&quot; data-ke-size=&quot;size18&quot;&gt;대표 사례&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1754&quot; data-start=&quot;1717&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1726&quot; data-start=&quot;1717&quot;&gt;ChatGPT&lt;/li&gt;
&lt;li data-end=&quot;1738&quot; data-start=&quot;1727&quot;&gt;이미지 생성 AI&lt;/li&gt;
&lt;li data-end=&quot;1746&quot; data-start=&quot;1739&quot;&gt;음성 인식&lt;/li&gt;
&lt;li data-end=&quot;1754&quot; data-start=&quot;1747&quot;&gt;얼굴 인식&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터 전처리&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;데이터&amp;nbsp;수집 &lt;br /&gt;&amp;darr; &lt;br /&gt;전처리 &lt;br /&gt;&amp;darr; &lt;br /&gt;학습 &lt;br /&gt;&amp;darr; &lt;br /&gt;예측&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정규분포&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터가 가장 많이 나타내는 형태(평균 근처에 데이터가 많이 모이고, 평균에서 멀어질수록 데이터가 적어지는 분포)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2012&quot; data-start=&quot;2003&quot; data-ke-size=&quot;size18&quot;&gt;대표적으로 정규분포를 따르는 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2030&quot; data-start=&quot;2014&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2017&quot; data-start=&quot;2014&quot;&gt;키&lt;/li&gt;
&lt;li data-end=&quot;2023&quot; data-start=&quot;2018&quot;&gt;몸무게&lt;/li&gt;
&lt;li data-end=&quot;2030&quot; data-start=&quot;2024&quot;&gt;시험점수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2072&quot; data-start=&quot;2061&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;정규분포의 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2260&quot; data-start=&quot;2203&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2221&quot; data-start=&quot;2203&quot;&gt;평균 근처에 데이터가 몰려있음&lt;/li&gt;
&lt;li data-end=&quot;2241&quot; data-start=&quot;2222&quot;&gt;양쪽으로 갈수록 데이터가 적어짐&lt;/li&gt;
&lt;li data-end=&quot;2260&quot; data-start=&quot;2242&quot;&gt;종 모양(Bell Curve)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1782206342582&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 정규분포
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 표준정규분포를 따르는 랜덤 데이터 (평균: 0, 표준편차: 1)
np.random.seed(42) # seed
data = np.random.randn(1000) # # 평균이 (0)이고 표준편차가 (1)인 표준정규분포로부터 1000개의 \(z\)-점수 난수를 생성

plt.hist(data, bins=30)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Nomaly Data')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9mzFT/dJMcafUDrLd/H5KWbNGFDZ3q7GDvFKPvL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9mzFT/dJMcafUDrLd/H5KWbNGFDZ3q7GDvFKPvL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9mzFT/dJMcafUDrLd/H5KWbNGFDZ3q7GDvFKPvL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9mzFT%2FdJMcafUDrLd%2FH5KWbNGFDZ3q7GDvFKPvL1%2Fimg.png&quot; onerror=&quot;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';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;392&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;2528&quot; data-start=&quot;2498&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스케일링&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;서로 다른 형태나 범위를 가진 데이터들을 &lt;/span&gt;공평하게 비교할 수 있도록 동일한 크기(스케일)로 맞춰주는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-root=&quot;ep&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 스케일링이 왜 필요한가요? (일상의 비유)&lt;/b&gt;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAEIBhAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;우리가 사과와 코끼리의 무게를 비교한다고 가정해 보겠습니다.&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIBxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;사과는 &lt;b&gt;'그램(g)'&lt;/b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt; 단위로 재서 &lt;b&gt;'300'&lt;/b&gt;이라는 숫자가 나왔습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIBxAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;코끼리는 &lt;b&gt;'톤(t)'&lt;/b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt; 단위로 재서 &lt;b&gt;'4'&lt;/b&gt;라는 숫자가 나왔습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;숫자만 보면 300이 4보다 훨씬 큽니다. 하지만 컴퓨터는 단위(g, t)를 이해하지 못하고 &lt;b&gt;숫자의 크기(300 vs 4)만 보고 사과가 코끼리보다 75배 더 무겁고 중요하다고 착각&lt;/b&gt;합니다. 이런 치명적인 오류를 막기 위해 단위를 통일하는 작업이 스케일링입니다.&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-root=&quot;ep&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 스케일링을 하면 무엇이 좋나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;공정한 비교&lt;/b&gt;: 단위와 범위가 다른 데이터(예: 키 180cm, 몸무게 70kg, 연봉 4000만 원)를 동일한 기준에서 비교할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICxAD&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;인공지능의 속도 향상&lt;/b&gt;: 컴퓨터가 정답(최적의 값)을 찾아가는 과정에서 숫자의 범위가 균일하면 지그재그로 헤매지 않고 &lt;b&gt;최단 거리로 빠르게&lt;/b&gt; 찾아갑니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;예측 정확도 상승&lt;/b&gt;: 숫자가 크다는 이유만으로 특정 데이터에만 모델이 과도하게 집중하는 현상을 막아주어 전체적인 예측 성능이 올라갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-end=&quot;2528&quot; data-start=&quot;2498&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Z-Score 표준화(Standardization)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터의 평균을 0, 표준편차를 1로 변환하여 서로 다른 변수들의 척도를 통일하는 데이터 전처리 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;2617&quot; data-end=&quot;2622&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;2624&quot; data-end=&quot;2667&quot;&gt;
&lt;li data-start=&quot;2624&quot; data-end=&quot;2637&quot;&gt;이상치에 비교적 강함&lt;/li&gt;
&lt;li data-start=&quot;2638&quot; data-end=&quot;2652&quot;&gt;정규분포 데이터에 적합&lt;/li&gt;
&lt;li data-start=&quot;2653&quot; data-end=&quot;2667&quot;&gt;통계 기반 모델에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;2669&quot; data-end=&quot;2676&quot;&gt;사용하는 모델&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;2678&quot; data-end=&quot;2711&quot;&gt;
&lt;li data-start=&quot;2678&quot; data-end=&quot;2684&quot;&gt;선형회귀&lt;/li&gt;
&lt;li data-start=&quot;2685&quot; data-end=&quot;2693&quot;&gt;로지스틱회귀&lt;/li&gt;
&lt;li data-start=&quot;2694&quot; data-end=&quot;2699&quot;&gt;신경망&lt;/li&gt;
&lt;li data-start=&quot;2700&quot; data-end=&quot;2705&quot;&gt;PCA&lt;/li&gt;
&lt;li data-start=&quot;2706&quot; data-end=&quot;2711&quot;&gt;SVM&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2532&quot; data-start=&quot;2530&quot; data-ke-size=&quot;size16&quot;&gt;공식&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 공식: (원점수 - 평균) / 표준편차
meat['Korea_std'] = (meat['Korea'] - meat['Korea'].mean()) / meat['Korea'].std()
meat['Japan_std'] = (meat['Japan'] - meat['Japan'].mean()) / meat['Japan'].std()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;결과&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;평균 = 0
표준편차 = 1

# 결과값 변수를 Z라고 할 때
Z=1 =&amp;gt; 평균보다 표준편차 1만큼 높은 값입니다.

Z=-2 =&amp;gt; 평균보다 표준편차 2만큼 낮은 값입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;역변환&lt;/b&gt;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;Z-Score 공식: z = (X - mu)/ sigma&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;X: 원래 데이터 값&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;mu: 데이터의 평균 (Mean)&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICRAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;sigm: 데이터의 표준편차 (Standard Deviation)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIChAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;이 식을 우리가 구하고자 하는 &lt;b&gt;원래 데이터 &lt;/b&gt;&lt;/span&gt;\(X\)&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;에 대해 정리(역변환)&lt;/b&gt;하면 다음과 같은 식이 유도&lt;/span&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIChAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICxAA&quot; data-sfc-root=&quot;ep&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;X= (sigma * z) + mu&lt;/b&gt;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAICxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAAIDBAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;즉, &lt;b&gt;(표준편차 \(\times z\)-점수) + 평균&lt;/b&gt;의 형태가 됩니다.&lt;/div&gt;
&lt;pre id=&quot;code_1782263793132&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1000명의 연간 육류 소비량
# 한국인: 평균 53.9kg, 표준편차: 5kg
# 일본인: 평균 32.7kg, 표준편차: 4kg

meat_korea = 5 * np.random.randn(1000) + 53.9
meat_japan = 4 * np.random.randn(1000) + 32.7&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2845&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Min-Max 정규화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터의 범위를 일정하게(보통 0과 1 사이) 조정하는 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;3039&quot; data-end=&quot;3044&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;3046&quot; data-end=&quot;3089&quot;&gt;
&lt;li data-start=&quot;3046&quot; data-end=&quot;3063&quot;&gt;데이터 범위를 동일하게 맞춤&lt;/li&gt;
&lt;li data-start=&quot;3064&quot; data-end=&quot;3072&quot;&gt;계산이 빠름&lt;/li&gt;
&lt;li data-start=&quot;3073&quot; data-end=&quot;3089&quot;&gt;거리 기반 알고리즘에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;3091&quot; data-end=&quot;3098&quot;&gt;사용하는 모델&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;3100&quot; data-end=&quot;3131&quot;&gt;
&lt;li data-start=&quot;3100&quot; data-end=&quot;3105&quot;&gt;KNN&lt;/li&gt;
&lt;li data-start=&quot;3106&quot; data-end=&quot;3115&quot;&gt;K-Means&lt;/li&gt;
&lt;li data-start=&quot;3116&quot; data-end=&quot;3121&quot;&gt;신경망&lt;/li&gt;
&lt;li data-start=&quot;3122&quot; data-end=&quot;3131&quot;&gt;이미지 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2849&quot; data-start=&quot;2847&quot; data-ke-size=&quot;size16&quot;&gt;공식&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 공식: (원점수 - 최솟값)/(최댓값 - 최솟값)
Min = np.min(meat['Korea'])
Max = np.max(meat['Korea'])
meat['Korea_mm'] = (meat['Korea'] - Min) / (Max - Min)

meat['Korea_mm'] = (meat['Korea'] - meat['Korea'].min()) / (meat['Korea'].max() - meat['Korea'].min())
meat[&quot;Japan_mm&quot;] = (meat['Japan'] - meat['Japan'].min()) / (meat['Japan'].max() - meat['Japan'].min())

meat.sample(10)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2916&quot; data-start=&quot;2911&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 모든 값이
0 ~ 1

# 원래 값변환 값
10	=&amp;gt; 0
20	=&amp;gt; 0.5
30	=&amp;gt; 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2954&quot; data-start=&quot;2944&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사이킷런 스케일러를 이용한 표준화/정규화&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 사이킷런 스케일러를 이용한 표준화 / 정규화
from sklearn.preprocessing import StandardScaler, MinMaxScaler

scaler = StandardScaler()
meat['Korea_std2'] = scaler.fit_transform(meat[['Korea']])
meat['Japan_std2'] = scaler.fit_transform(meat[['Japan']])
meat.sample(10)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;scaler2 = MinMaxScaler()
meat['Korea_mm2'] = scaler2.fit_transform(meat[['Korea']])
meat['Japan_mm2'] = scaler2.fit_transform(meat[['Japan']])

meat.sample(10)

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;의사결정나무(지도학습)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터를 분류(Classification)하거나 연속적인 값을 예측(Prediction)하기 위해, 의사결정 규칙을 나무(Tree) 구조로 도표화한 지도학습 머신러닝 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  &lt;b&gt;의사결정나무의 주요 특징&lt;/b&gt;&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiL-tmR3J6VAxXDnK8BHUPaGzUQi4wTegoIAggACAAIAxAK&quot; data-bfc=&quot;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAMQCw&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;직관적인 구조&lt;/b&gt;: 마치 '스무고개'나 조건문(if-else)과 같이 데이터를 분류하여 누구나 쉽게 이해하고 결과를 설명할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAMQDA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;분류 및 회귀&lt;/b&gt;: 범주형 데이터를 분류하는 분류 트리와 연속형 데이터를 예측하는 회귀 트리 모두에 사용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAMQDQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;데이터 전처리 용도&lt;/b&gt;: 변수의 정규화(스케일링) 등 복잡한 데이터 전처리가 거의 필요 없어 사용이 편리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAMQDg&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;과적합(Overfitting)의 위험&lt;/b&gt;: 나무가 너무 복잡해지면 학습 데이터에만 맞춰져 새로운 데이터에 대한 예측 성능이 떨어질 수 있습니다. 이를 방지하기 위해 가지치기(Pruning) 과정이 필수적입니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiL-tmR3J6VAxXDnK8BHUPaGzUQi4wTegoIAggACAAIAxAT&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;  &lt;b&gt;의사결정나무의 핵심 구조와 작동 원리&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiL-tmR3J6VAxXDnK8BHUPaGzUQi4wTegoIAggACAAIAxAW&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAMQFw&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;데이터의 불순도(Impurity)를 낮추고 순도(Purity)를 높이는 방향으로 데이터를 분할합니다.&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiL-tmR3J6VAxXDnK8BHUPaGzUQi4wTegoIAggACAAIAxAc&quot; data-bfc=&quot;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAMQHQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;루트 노드(Root Node)&lt;/b&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;: 나무의 가장 최상단으로, 전체 데이터가 시작되는 지점입니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiL-tmR3J6VAxXDnK8BHUPaGzUQi4wTegoIAggACAAIHRAA&quot; data-bfc=&quot;&quot;&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 20px; font-weight: 600; margin: 24px 0px 12px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;분할 기준 (불순도 측정 지표)&lt;/div&gt;
&lt;/div&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwiL-tmR3J6VAxXDnK8BHUPaGzUQi4wTegoIAggACAAIHRAD&quot; data-bfc=&quot;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACB0QBA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;지니 계수(Gini Index)&lt;/b&gt;: 데이터가 얼마나 불순한지를 나타내며, 값이 0에 가까울수록 완벽하게 분류된 상태를 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACB0QBQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;엔트로피(Entropy)&lt;/b&gt;: 데이터의 무질서함을 측정하는 지표로, 엔트로피가 낮을수록 정보가 명확합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;1204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yn0ut/dJMcahEQuL1/EnUsaskzN7zgD4trk90DVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yn0ut/dJMcahEQuL1/EnUsaskzN7zgD4trk90DVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yn0ut/dJMcahEQuL1/EnUsaskzN7zgD4trk90DVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyn0ut%2FdJMcahEQuL1%2FEnUsaskzN7zgD4trk90DVK%2Fimg.png&quot; onerror=&quot;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';&quot; loading=&quot;lazy&quot; width=&quot;1880&quot; height=&quot;1204&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;1204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1782264814928&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 1) 필수 패키지 import
# 패키지 임포트
import pandas as pd
import numpy as np
import sklearn

# 학습 및 테스트 데이터셋 분리를 패키지
from sklearn.model_selection import train_test_split

# 의사결정나무 분류모델을 위한 알고리즘
from sklearn.tree import DecisionTreeClassifier

## 2) 데이터 불러오기
df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
df

## 3) 데이터 탐색
df.shape # 데이터 개수와 열 개수를 확인
df.info()
df.describe()

## 4) 전처리
# 범주형값 바꾸기 (레이블 인코딩)
df['species'].unique()
df['species'].value_counts()
df['species'] = df['species'].replace({'setosa':0, 'versicolor':1,'virginica':2})
df.info()

## 5) 데이터셋 분리
# 분석 데이터셋 준비 (독립변수(피처), 종속변수(타겟))
X = df[['sepal_length','sepal_width','petal_length','petal_width']]
y = df['species']

# 데이터셋 분리 (학습용, 테스트용 = 8:2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape, sep=&quot;\n&quot;)

## 6) 머신러닝 학습
### DecisionTreeClassifier 객체 생성 (알고리즘 선택)
dt = DecisionTreeClassifier(random_state=42)

# 학습 수행
dt.fit(X_train, y_train) # 학습용 문제와 답지

## 7) 예측 수행
pred = dt.predict(X_test)
pred

y_test.values

## 8) 성능분석 (성능지표 확인)
# 정확도
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test, pred)
print(acc)

# 정밀도, 재현율, f1-score
from sklearn.metrics import classificaton_report
rpt = classification_report(y_test, pred)
print(rpt)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;핵심 4대 척도 (Metrics)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size18&quot;&gt;4대 척도의 역할과 쓰임새&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;모델이 단순히 전체 정확도(Accuracy)만 높다고 좋은 모델은 아닙니다. &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;3&quot;&gt;데이터가 한쪽으로 치우쳐 있을 때(예: 암 환자가 1%밖에 없는 경우)&lt;/b&gt; 정확도는 99%가 나와도 실제 암 환자를 하나도 못 찾을 수 있기 때문입니다. 이때 이 척도들이 필요합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;정확도 (Accuracy)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;수식:&lt;/b&gt; (&lt;span data-index-in-node=&quot;4&quot; data-math=&quot;\frac{TP + TN}{TP + TN + FP + FN}&quot;&gt;TP + TN) / (TP + TN + FP + FN)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-index-in-node=&quot;4&quot; data-math=&quot;\frac{TP + TN}{TP + TN + FP + FN}&quot;&gt;&lt;b&gt;필요성:&lt;/b&gt; 전체 예측 중 맞춘 비율을 나타내므로, 전체 성능을 간단하게 평가 할수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-index-in-node=&quot;4&quot; data-math=&quot;\frac{TP + TN}{TP + TN + FP + FN}&quot;&gt;&lt;b&gt;언제 사용하나:&lt;/b&gt; 클래스 불균형이 심하지 않은 경우에 유용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-index-in-node=&quot;4&quot; data-math=&quot;\frac{TP + TN}{TP + TN + FP + FN}&quot;&gt;&lt;b&gt;왜 필요한가:&lt;/b&gt; 모델이 전반적으로 잘 작동하는지 확인하기 위해 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;정밀도 (Precision)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;수식: &lt;/b&gt;&lt;span data-index-in-node=&quot;4&quot; data-math=&quot;\frac{TP}{TP + FP}&quot;&gt;TP / (TP + FP)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;용도:&lt;/b&gt; 실제는 아닌데 참이라고 잘못 판단하면 큰 손해가 발생하는 경우 중요합니다 (예: 스팸 메일 분류).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필요성:&lt;/b&gt; 모델의 긍정 예측이 얼마나 신뢰할 수 있는 지를 측정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 사용하나:&lt;/b&gt; False Postibie(잘못된 긍정 예측0의 비용이 높은 경우에 중요합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;왜 필요한가:&lt;/b&gt; 긍정 예측의 신뢰성을 높이고자 할 때 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;재현율 (Recall 또는 Sensitivity)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;수식:&lt;/b&gt; &lt;span data-index-in-node=&quot;4&quot; data-math=&quot;\frac{TP}{TP + FN}&quot;&gt;TP / (TP + FN)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;용도:&lt;/b&gt; 실제 참인 것을 놓치면 치명적인 경우 중요합니다 (예: 암 진단, 범죄 탐지).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필요성:&lt;/b&gt; 실제 긍정 중에서 모델이 얼마나 잘 긍정 예측을 했는 지를 나타냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 사용하나:&lt;/b&gt; False Negative(잘못된 부정 예측)의 비용이 높은 경우에 중요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;왜 필요한가:&lt;/b&gt; 긍정 사례를 최대한 많이 찾아내고자 할 때 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;F1-Score&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;수식:&lt;/b&gt; 2 x ((Precision x Recall) / (Precision + Recall))&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;용도:&lt;/b&gt; 한쪽 지표에 치우치지 않고 모델의 전체적인 성능을 균형 있게 평가할 때 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필요성:&lt;/b&gt; 정밀도와 재현율 간의 균형을 평가합니다.(조화 평균)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 사용하나:&lt;/b&gt; 정밀도와 재현을 모두 중요할 떄, 특히 데이터가 불균형할 경우에 유용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;왜 필요한가:&lt;/b&gt; 두 지표간의 균형을 유지하여, 한쪽에 치우치지 않은 성능 평가를 위해 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Support&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개념: &lt;/b&gt;각 클래스에 속한 실제 데이터의 개수입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 성능을 평가할 때 해당 클래스의 데이터 수가 너무 적지는 않은지(신뢰할 수 있는지) 판단하는 기준이 됩니다. 위의 예시에서는 0번 클래스 50개, 1번 클래스 50개로 총 100개의 데이터가 평가에 사용되었음을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;혼동행렬(Confusion Matrix)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4가지 경우의 수 (혼동 행렬의 구성 요소)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;모델의 예측값과 실제 정답을 비교했을 때 발생하는 4가지 조합입니다. (여기서 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;3&quot;&gt;양성/음성&lt;/b&gt;은 모델이 분류하고자 하는 대상을 의미합니다.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;TP (True Positive):&lt;/b&gt; 실제 정답이 '참'인데, 모델도 '참'이라고 &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;4,0,0&quot;&gt;맞춘 경우&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;TN (True Negative):&lt;/b&gt; 실제 정답이 '거짓'인데, 모델도 '거짓'이라고 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;4,1,0&quot;&gt;맞춘 경우&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;FP (False Positive):&lt;/b&gt; 실제 정답은 '거짓'인데, 모델이 '참'이라고 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;4,2,0&quot;&gt;틀린 경우&lt;/b&gt; (오경보, 1종 오류).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,0&quot;&gt;FN (False Negative):&lt;/b&gt; 실제 정답은 '참'인데, 모델이 '거짓'이라고 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;4,3,0&quot;&gt;틀린 경우&lt;/b&gt; (놓침, 2종 오류).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분류 모델의 성능을 &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;0&quot;&gt;'교차표(Cross-table)'&lt;/b&gt; 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;구조 살펴보기 (2x2 이진 분류 예시)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;가장 기본이 되는 이진 분류(맞다/틀리다)의 혼동 행렬은 다음과 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;7&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;실제 \ 예측&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;예측: 양성(Positive)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;예측: 음성(Negative)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0,0&quot;&gt;실제: 양성(Positive)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,0&quot;&gt;TP&lt;/b&gt; (잘 맞춤)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,2,0&quot;&gt;FN&lt;/b&gt; (놓침 - 오답)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0,0&quot;&gt;실제: 음성(Negative)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,2,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,1,0&quot;&gt;FP&lt;/b&gt; (잘못된 경고 - 오답)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;7,2,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,2,0&quot;&gt;TN&lt;/b&gt; (잘 맞춤)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;다중 분류(Multi-class)로 확장&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1782267680693&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 혼동 행렬 (가로: 예측, 세로: 실제 답)
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, pred)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;대각선 요소:&lt;/b&gt; 실제 클래스와 예측 클래스가 일치하는 경우 (모델이 맞춘 것)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;대각선 외 요소:&lt;/b&gt; 실제 클래스와 예측 클래스가 다른 경우 (모델이 무엇으로 착각했는지 확인 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tKfWN/dJMcaiX1vJN/aqkHfUvRqR3vYbfxP9kLF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tKfWN/dJMcaiX1vJN/aqkHfUvRqR3vYbfxP9kLF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tKfWN/dJMcaiX1vJN/aqkHfUvRqR3vYbfxP9kLF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtKfWN%2FdJMcaiX1vJN%2FaqkHfUvRqR3vYbfxP9kLF1%2Fimg.png&quot; onerror=&quot;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';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;136&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/70</guid>
      <comments>https://cd-record.tistory.com/70#entry70comment</comments>
      <pubDate>Tue, 23 Jun 2026 18:33:30 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.22) Pandas 그룹화/형변환</title>
      <link>https://cd-record.tistory.com/69</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;형변환(.astype)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;형변환을 하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;데이터가 &quot;무엇인가&quot;에 따라 컴퓨터가 할 수 있는 일이 정해져 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;계산이 필요할 때:&lt;/b&gt; 문자열 '100'은 숫자 100과 다릅니다. '100'은 그냥 글자일 뿐이라서 더하기를 하면 오류가 나거나 글자가 이어붙여집니다. 숫자(int/float)로 바꿔야 계산이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;분석이 필요할 때:&lt;/b&gt; 날짜가 적힌 글자('2026-06-22')는 그냥 글자일 뿐이지만, 날짜 타입(datetime)으로 바꾸면 &quot;오늘이 무슨 요일인지&quot;, &quot;지난주와 비교하면 어떤지&quot;를 계산할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;용량 최적화:&lt;/b&gt; 메모리를 너무 많이 차지하는 타입을 가벼운 타입으로 바꾸면 대용량 데이터를 다룰 때 훨씬 빠르고 쾌적합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정수형&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;- .astype(int) 또는 .astype('int64')
    - 소수점 아래를 버리고 정수로 변환
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 1. 단일 열 형변환 (문자열 -&amp;gt; 정수)
df['나이'] = df['나이'].astype(int)
df.info(0)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실수형&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;- .astype(float) 또는 .astype('float64')
    - 소수점을 포함하는 실수로 변환
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문자열&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;- .astype(str) 또는 .astype('object')
    - 텍스트 데이터로 변환
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;범주형&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;- .astype('category')
    - 고유값 종류가 적을 때 메모리를 아끼는 타입
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;숫자 변환 전용(pd.to_numeric())&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;errors 옵션에 따라 결과가 달라집니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;- 1. errors='raise'(기본값): 에러를 발생시킵니다
- 2. errors='ignore': 변환하지 않고 원본을 그대로 둠
- 3. errors='coerce': 숫자로 못 바꾸는 것은 결측치(NaN로 처리)(★가장 많이 씀)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;s = pd.Series(['10','20','치명적 오류', '40'])
# s.astype(int) -&amp;gt; '치명적 오류' 문자열 때문에 오류

s_converted = pd.to_numeric(s,errors='coerce')
# 'coerce'를 통해 '치명적 오류' -&amp;gt; NaN 으로 변환
s_converted&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치(NaN)가 있는 열을 int로 바꿀 때, 콤마(,)가 포함된 가격 데이터&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 1) 결측치를 먼저 채우고 변환하기
df['열이름'] = df['열이름'].fillna(0).astype(int)

# 2) 결측치를 사전에 지우거나 다른 값으로 채우고 변환하기
df['열이름'] = df['열이름'].drop(0)
df['열이름'] = df['열이름'].astype(int)

df['열이름'] = df['열이름'].fillna(df['열이름'].mean()).astype(int)

# 콤마(,)가 포함된 가격 데이터 (1, 250)
df['가격'] = df['가격'].str.replace(',').astype(int)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 날짜/시간 변환 전용(pd.to_datetime())&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열로 된 날짜 데이터를 판다스가 인식하는 datetime64 타입으로 바꿔줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자주 쓰는 기본 단위(Unit)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;약어(추천)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;풀네임&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;'D'&lt;/b&gt; 또는 &lt;b&gt;'d'&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;'day' / 'days'&lt;/td&gt;
&lt;td&gt;&lt;b&gt;일 (Days)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;'h'&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;'hour' / 'hours'&lt;/td&gt;
&lt;td&gt;&lt;b&gt;시간 (Hours)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;'m'&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;'minute' / 'minutes'&lt;/td&gt;
&lt;td&gt;&lt;b&gt;분 (Minutes)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;'s'&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;'second' / 'seconds'&lt;/td&gt;
&lt;td&gt;&lt;b&gt;초 (Seconds)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;format='mixed'&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df = pd.DataFrame({'날짜': ['2026-01-01','2026/05/15','2026.12.25']})
print(df.info())

df['날짜'] = pd.to_datetime(df['날짜'], format='mixed') 
# format='mixed': 형태가 다 다를 때 문자열에서 바로 변환할 때 사용
# errors='coerce': 유효하지 않은 문자열은 NaN으로 변환
print(df.info())

df=  pd.DataFrame({'날짜': ['20260617','20260618']})
df['날짜'] = pd.to_datetime(df['날짜'], format='%Y%m%d')
df&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;연, 월, 일 추출 (수치형 데이터로 변환됨)&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df['연도'] = df['날짜'].dt.year
df['월'] = df['날짜'].dt.month
df['일'] = df['날짜'].dt.day
df.info()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;요일 추출 (0: 월요일, 1: 화요일, ..., 6: 일요일 | Monday, Tuesday, ... )&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 요일 추출 (0: 월요일, 1: 화요일, ..., 6: 일요일)
df['요일_숫자'] = df['날짜'].dt.weekday
df

# 요일 이름 추출 (Mnonday, Tuesday 등)
df['요일_이름'] = df['날짜'].dt.day_name()
df&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;날짜 연산 (timedelta)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1782117419168&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 두 날짜의 차이 구하기 (날짜 연산 사용시 타입: timedelta)
df_user['유지기간'] = df_user['탈퇴일'] - df_user['가입일']

# timedelta 형태로 바꾸기
pd.to_timedelta(df_user['유지일수'], unit='D')&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;import pandas as pd

df_user = pd.DataFrame({
    '가입일': pd.to_datetime(['2025-01-01','2025-03-15']),
    '유지일수': [537, 285] # 정수형 일수 데이터
})

# 정수형 숫자를 날짜 간격(Days) 데이터로 변환하여 더하기
df_user['복구일'] = df_user['가입일'] + pd.to_timedelta(df_user['유지일수'], unit = 'D')

df_user
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;' 정수형 숫자(일수)'만 추출하기 (.dt.days)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1782117490251&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# '정수형 숫자(일수)'만 추출하기 (.dt.days)
df_user['유지일수'] = df_user['유지기간'].dt.days&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;중복 데이터 처리(.duplicated)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import pandas as pd

data = {
    '이름': ['김철수', '이영희', '박민수', '정미영', '강지아', '최현우', '송은지', '송은지'],
    '나이': [25, 30, 50, 28, 32, 35, 29, 29],
    '몸무게': [75.0, 55.0, 68.0, 63.7, 52.0, 80.0, 58.0, 58.0],
    '생년월일': ['20000101', '1994-05-15', '1993-08-22', '1996-02-28', '1998-11-30', '1989-07-12', '1995-03-18', '1995-03-18'],
    '급여': [3500000, 3985714, 4200000, 3800000, 3600000, 5000000, 3900000, 3900000]
}
df = pd.DataFrame(data)
df

df.duplicated().sum()
df.duplicated()
df[df.duplicated()]
df.drop_duplicates() # 원본은 삭제 안됨&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;df.duplicated() (반환 타입: Series(true/false))&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;결과:&lt;/b&gt; 각 행이 중복인지 여부를 알려주는 True와 False로 이루어진 리스트(Series)를 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;의미:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;False: 이 행은 처음 등장함 (중복 아님)&lt;/li&gt;
&lt;li&gt;True: 이 행은 이전에 이미 등장했음 (중복됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;df.duplicated().sum() (반환 타입: 숫자(int))&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;결과:&lt;/b&gt; 전체 데이터에서 중복된 행이 총 몇 개인지 나타내는 '숫자'를 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;의미:&lt;/b&gt; True인 행의 개수를 모두 더한 값이므로, 데이터에 &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;5,1,0&quot;&gt;전체적으로 중복이 몇 건 있는지&lt;/b&gt; 빠르게 파악할 때 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;df[df.duplicated()] (반환 타입: DataFrame)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;결과:&lt;/b&gt; &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;7,0,0&quot;&gt;중복된 행들만 실제로 추출&lt;/b&gt;해서 보여주는 '데이터프레임'을 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;의미:&lt;/b&gt; &quot;도대체 어떤 데이터들이 중복되어 있는 거지?&quot; 하고 직접 눈으로 확인하고 싶을 때 사용합니다. (df 전체에서 중복인 행만 필터링한 결과입니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;df.drop_duplicates() &lt;/b&gt;&lt;b&gt;(반환 타입: DataFrame)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;결과:&lt;/b&gt; 중복된 행을 제거한 '새로운 데이터프레임'을 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;의미:&lt;/b&gt; 말 그대로 중복을 정리하는 명령어입니다. (기본적으로 첫 번째 등장한 행은 살려두고, 뒤에 나타나는 중복값들을 삭제합니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;그룹화(Group By)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;방대한 데이터를 특정 기준에 따라 분류하고, 그룹별로 통계 정보를 요약하기 위해 사용하는 핵심 기능&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;import pandas as pd
data = [['김민재', 31, 75, 5428000],
        ['이강인', 22, 57, None],
        ['박찬호', 50, None, 8428000],
        ['차범근', 70, 80, 4428000],
        ['추신수', 43, 100, 4528000],
        ['손흥민', 31, 72, 7028000],
        ['황희찬', 28, 69, 2528000]]
df = pd.DataFrame(data, columns=['성명', '나이', '몸무게', '급여'])
df

df['나이'].unique()

df['종목'] = ['축구','축구','야구','축구','야구','축구','축구']
df
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인덱스(Index) 변경&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;df7 = df.copy()
df7.index = ['A','B','C','D','E','F','G']

df8 = df7.set_index('성명') # 기존 컬럼(열)을 index로
df8

df9 = df8.reset_index() # index를 컬럼(열)으로 
df9

df9 = df8.reset_index(drop=True) # index를 버림
df9
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;set_index()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 컬럼을 인덱스로 변경&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;reset_index()&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인덱스를 다시 일반 컬럼으로 변경&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;drop=True &lt;/b&gt;:&amp;nbsp; 기존 인덱스를 삭제하고 새 인덱스를 생성한다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그룹화(GroupBy)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;groupby()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 컬럼을 기준으로 데이터를 그룹으로 묶는다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그룹별 합계 구하기(sum())&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;df_grp = df.groupby('나이').sum()
df_grp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1137&quot; data-start=&quot;1135&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;      몸무게        급여
나이
22    57.0       0
31   147.0 12456000
43   100.0 4528000
...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특정 그룹 조회, 평균 구하기&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 특정 그룹 조회
df_grp.loc[31]
'''
몸무게      147.0
급여   12456000
'''

# 특정 컬럼 평균
df_hap = df.groupby('종목')[['나이','몸무게','급여']].mean()
df_hap
'''
          나이    몸무게        급여
종목
야구      46.5 100.0 6478000
축구      36.4  70.6 4853000
'''

# 숫자형 컬럼 전체 평균(숫자형 컬럼만 자동 선택하여 평균 계산)
df.groupby('종목').mean(numeric_only=True)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;다중 그룹화(Multi GroupBy)&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;df = pd.DataFrame({
    '제품':['노트북','태블릿','스마트폰','노트북','스마트폰','태블릿'],
    '지역':['서울','부산','서울','대구','부산','서울'],
    '판매량':[10,5,8,12,6,4],
    '가격':[1200000,500000,800000,1300000,750000,550000],
    '판매자번호':['A01','A02','A01','A03','A02','A03']
})&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2342&quot; data-start=&quot;2329&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;제품별 평균 판매량/지역+제품별 판매량&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 제품별 판매량
df.groupby('제품')[['판매량']].mean()
'''
        판매량
제품
노트북    11.0
스마트폰   7.0
태블릿    4.5
'''

# 지역, 제품별 판매량
df_prd = df.groupby(['지역','제품'])[['판매량']].sum()
df_prd
'''
             판매량
지역 제품
부산 스마트폰      6
부산 태블릿       5
대구 노트북      12
서울 노트북      10
서울 스마트폰      8
서울 태블릿       4
'''&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2394&quot; data-start=&quot;2392&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px;&quot;&gt;특정 그룹 조회&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# 서울 전체 조회
df_prd.loc[['서울']]
'''
        판매량
제품
노트북     10
스마트폰     8
태블릿      4
'''

# 서울 스마트폰 판매량
df_prd.loc[[('서울','스마트폰')]]
'''
             판매량
지역 제품
서울 스마트폰     8
'''&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2869&quot; data-start=&quot;2867&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3098&quot; data-start=&quot;3052&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3098&quot; data-start=&quot;3054&quot; data-ke-size=&quot;size16&quot;&gt;다중 인덱스(Multi Index)는 튜플 (지역, 제품) 형태로 조회한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/blockquote&gt;
&lt;h3 data-end=&quot;3124&quot; data-start=&quot;3105&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;agg() 집계 함수&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3544&quot; data-start=&quot;3520&quot; data-ke-size=&quot;size16&quot;&gt;여러 집계 함수를 한 번에 적용할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;3551&quot; data-start=&quot;3546&quot; data-ke-size=&quot;size18&quot;&gt;문법&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;df.groupby('컬럼').agg({
    '컬럼명':['함수1','함수2']
})&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3628&quot; data-start=&quot;3623&quot; data-ke-size=&quot;size18&quot;&gt;예제&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;result = df.groupby('제품').agg({
    '판매량':['sum','mean','count'],
    '가격':['min','max']
})&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3739&quot; data-start=&quot;3737&quot; data-ke-size=&quot;size18&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;        판매량              가격
         sum mean count    min      max
제품
노트북      22 11.0     2 1200000 1300000
스마트폰     14  7.0     2  750000  800000
태블릿       9  4.5     2  500000  550000&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/69</guid>
      <comments>https://cd-record.tistory.com/69#entry69comment</comments>
      <pubDate>Mon, 22 Jun 2026 18:00:34 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.19) Pandas 데이터 전처리 정리</title>
      <link>https://cd-record.tistory.com/68</link>
      <description>&lt;h2 data-end=&quot;125&quot; data-start=&quot;104&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-end=&quot;125&quot; data-start=&quot;104&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
Pandas 데이터 전처리 핵심 정리&lt;/b&gt;&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;import pandas as pd

data = [
    ['김민재', 31, 75, 5428000],
    ['이강인', 22, 57, None],
    ['박찬호', 50, None, 8428000],
    ['차범근', 70, 80, 4428000],
    ['추신수', 43, 100, 4528000],
    ['손흥민', 31, 72, 7028000],
    ['황희찬', 28, 69, 2528000]
]

df = pd.DataFrame(data, columns=['성명', '나이', '몸무게', '급여'])&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;125&quot; data-start=&quot;104&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. sample() : 랜덤 추출&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;457&quot; data-start=&quot;443&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;행 n개 랜덤 추출&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;df.sample(3)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;500&quot; data-start=&quot;487&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;비율로 랜덤 추출&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;train = df.sample(frac=0.7)
# 랜덤 (1을 기준 백분율, 0.7~70%)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터프레임이나 시리즈에서 전체 데이터 대비 &lt;b&gt;지정된 비율(%)만큼의 데이터를 무작위로 추출&lt;/b&gt;할 때 사용&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;590&quot; data-start=&quot;545&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;572&quot; data-start=&quot;545&quot;&gt;frac=0.7 &amp;rarr; 전체 데이터의 70% 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;604&quot; data-start=&quot;592&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;랜덤 결과 고정&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;train = df.sample(frac=0.7, random_state=42)
# 코드를 실행할 때마다 추출되는 데이터가 매번 달라집니다. 이를 방지하고 항상 같은 데이터가 추출되도록 하려면 생성 변수(random_state)를 지정하는 것이 좋습니다.
# random_state(생성 변수)는 무작위(랜덤) 결과를 항상 동일하게 고정해 주는 역할을 합니다.
# 컴퓨터의 랜덤은 사실 완전히 무작위가 아니라 특정 '시작 숫자(Seed)'를 바탕으로 계산된 규칙적인 난수입니다.
# 이 시작 숫자를 고정하는 매개변수가 바로 random_state입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;random_state는 무작위(Random) 추출 결과를 &lt;b&gt;언제 실행해도 똑같이 나오도록 고정&lt;/b&gt;하는 역할&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;712&quot; data-start=&quot;666&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;697&quot; data-start=&quot;666&quot;&gt;random_state : 랜덤 시드(seed) 고정&lt;/li&gt;
&lt;li data-end=&quot;712&quot; data-start=&quot;698&quot;&gt;항상 동일한 결과 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;864&quot; data-start=&quot;841&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. sort_values() : 정렬&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;874&quot; data-start=&quot;866&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오름차순&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.sort_values(by='나이')
# by는 생략 가능!!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;963&quot; data-start=&quot;955&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;내림차순&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.sort_values('나이', ascending=False)
# ascending: 오름차순, 내림차순(안 썼을 시 기본 오름차순)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1027&quot; data-start=&quot;1018&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;다중 정렬&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df.sort_values(
    ['나이', '몸무게'],
    ascending=True
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1130&quot; data-start=&quot;1100&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1110&quot; data-start=&quot;1100&quot;&gt;나이 기준 정렬&lt;/li&gt;
&lt;li data-end=&quot;1130&quot; data-start=&quot;1111&quot;&gt;나이가 같으면 몸무게 기준 정렬&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1148&quot; data-start=&quot;1137&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 결측치 확인(.isna())&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1163&quot; data-start=&quot;1150&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치 여부 확인&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;df.isna()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1203&quot; data-start=&quot;1190&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치 개수 확인&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;df.isna().sum()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1289&quot; data-start=&quot;1273&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특정 컬럼(열)에서 결측치 행 찾기&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;df[df['몸무게'].isna()]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1397&quot; data-start=&quot;1379&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치가 하나라도 있는 행&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;df[df.isna().any(axis=1)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1453&quot; data-start=&quot;1440&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특정 컬럼(열)에서 결측치가 없는 행&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;df[df['몸무게'].notna()]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1553&quot; data-start=&quot;1533&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. drop() : 행/열 삭제&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1563&quot; data-start=&quot;1555&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;행 삭제&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;df.drop(0)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;df.drop([1, 3, 5]) # axis = 0 (기본값)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1633&quot; data-start=&quot;1625&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;열 삭제&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df.drop('몸무게', axis=1)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1675&quot; data-start=&quot;1673&quot; data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.drop(columns=['몸무게','급여']) # 복수 선택 가능&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;인덱스 위치로 삭제&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.drop(index=[1,3,5])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;1897&quot; data-start=&quot;1875&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. dropna() : 결측치 제거&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1920&quot; data-start=&quot;1899&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치가 하나라도 있는 행 제거&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;df.dropna()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1970&quot; data-start=&quot;1949&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치가 하나라도 있는 열 제거&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.dropna(axis=1)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;1949&quot; data-end=&quot;1970&quot;&gt;&lt;b&gt;how='any'&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.dropna(how='any') # 기본값: axis=0, how='any'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;1970&quot; data-start=&quot;1949&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;모든 값이 결측치인 경우만 제거&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.dropna(how='all')

df.dropna(how='all', axis=1) # 열 기준&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2199&quot; data-start=&quot;2189&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;thresh&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.dropna(thresh=4)
# 유효한 데이터가 4개 이상인 행만 유지

df.dropna(axis=1, thresh=6)
# 유효한 데이터가 6개 이상인 열만 유지&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;2357&quot; data-start=&quot;2334&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. fillna() : 결측치 채우기&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;2373&quot; data-start=&quot;2359&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특정 값으로 채우기&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df.fillna(0)
# fillna: 결측지를 해당 값으로 수정(자료형: float)

# np.nan: null 값(넘파이 선언 시 사용 가능), 이상치 강은 값을 처리할 경우 np.nan(단, numpy 선언 시 사용 가능)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2421&quot; data-start=&quot;2408&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;평균값으로 채우기(mean)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;df['몸무게'].fillna(
    df['몸무게'].mean()
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-start=&quot;2408&quot; data-end=&quot;2421&quot;&gt;&lt;b&gt;중앙값(Median)&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;df['몸무게'].fillna(
    df['몸무게'].median()
)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;2421&quot; data-start=&quot;2408&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;최빈값(mode)&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df['몸무게'].fillna(
    df['몸무게'].mode()[0]
)
※ mode()는 Series를 반환하므로 [0] 사용&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;여러 컬럼 한 번에 채우기&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;replace_values = {
    '몸무게': df['몸무게'].mean(),
    '급여': df['급여'].median()
}

df.fillna(value=replace_values)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;2838&quot; data-start=&quot;2828&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 이상치(Outlier)처리&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1782091871397&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np

data = {
    '이름': ['김철수', '이영희', '박민수', '최수진', '홍길동'],
    '나이': [25, 30, 28, 22, 190]  
}
df = pd.DataFrame(data)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-end=&quot;3304&quot; data-start=&quot;3293&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;요약 통계량(평균, 최소값, 최대값, 사분위수 등)을 한눈에 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1782092007053&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.describe()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-end=&quot;3326&quot; data-start=&quot;3306&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;150세 초과를 이상치로 처리&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;df.loc[df['나이'] &amp;gt; 150, '나이'] = np.nan&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치 대체&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;df['나이'] = df['나이'].fillna(190)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;3454&quot; data-start=&quot;3445&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;IQR 방식&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;3473&quot; data-start=&quot;3456&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1단계 : 사분위수 계산&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# IQR 및 정상 범위 계산(quantile(분위수): 크기 순서대로 정렬된 데이터를 특정 비율로 나누는 기준값)
Q1 = df['나이'].quantile(0.25)
Q3 = df['나이'].quantile(0.75)

IQR = Q3 - Q1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2단계 : 정상 범위 계산&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3단계 : 이상치 찾기&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;outlier_condition = (
    (df['나이'] &amp;lt; lower_bound) |
    (df['나이'] &amp;gt; upper_bound)
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px;&quot;&gt;4단계 : NaN 처리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;matlab&quot;&gt;&lt;code&gt;df.loc[outlier_condition, '나이'] = np.nan&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;3880&quot; data-start=&quot;3852&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. value_counts() : 빈도수 계산&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1782092481934&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#판다스(Pandas)의 value_counts()는 시리즈(Series)나 데이터프레임(DataFrame)의 각 값들이 몇 번씩 등장하는지(빈도수)를 세어주는 핵심 함수
import pandas as pd
import numpy as np

data = {
    '품목': ['사과', '바나나', '사과', '오렌지', '바나나', '사과', np.nan],
    '수량': [3, 2, 5, 1, 2, 3, 4]
}
df = pd.DataFrame(data)
print(df)&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ceylon&quot;&gt;&lt;code&gt;df['품목'].value_counts()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3923&quot; data-start=&quot;3921&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;사과      3
바나나    2
오렌지    1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3981&quot; data-start=&quot;3971&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결측치 포함&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df['품목'].value_counts(dropna=False)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px;&quot;&gt;비율 확인( 0~1 사이의 비율로 반환)&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df['품목'].value_counts(normalize=True)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4105&quot; data-start=&quot;4103&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;사과      0.50
바나나    0.33
오렌지    0.17&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;4173&quot; data-start=&quot;4162&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오름차순 정렬&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df['품목'].value_counts(
    ascending=True
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구간별 빈도수&lt;/b&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df['수량'].value_counts(bins=3)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4299&quot; data-start=&quot;4297&quot; data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;(0.99, 2.33]    3
(2.33, 3.66]    2
(3.66, 5.0]     2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;느낀점&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;이번주는 데이터 전처리 과정에 대해 numpy, matplotlib, pandas의 메소드에 대해 배웠다. 배워야하는 내용들은 되게 많겠지만 시간이 별로 없기 때문에 메소드 위주로 수업을 진행했는데 AI를 들어가기 전 데이터 전처리는 중요하기 때문에 제대로 배워야겠다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/68</guid>
      <comments>https://cd-record.tistory.com/68#entry68comment</comments>
      <pubDate>Fri, 19 Jun 2026 18:00:37 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.17) Pandas</title>
      <link>https://cd-record.tistory.com/66</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;br /&gt;Pandas&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Pandas이란?&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pandas는 파이썬에서 데이터 작업에 사용되는 라이브러리로 데이터 분석, 정리, 탐색, 조작을 위한 기능이 포함되어 빅데이터 분석은 물론 통계 이론에 기반한 데이터 분석이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 데이터 구조(Data Structures)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Series(시리즈)&lt;/b&gt;: 1차원 배열로, 인덱스(Index)와 값(Value)으로 구성, 하나의 열(Column)데이터라고 생각&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DataFrame(데이터 프레임)&lt;/b&gt;: 2차원 표 구조, 여러 개의 시리즈가 모여 만들어지며, 행(Row), 열(Column)로 구성된 데이터 분석의 기본 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 주요 기능&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;데이터 입출력&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;CSV, Excel, SQL, JSON 등 다양한 형식의 파일을 쉽게 읽고(read) 쓸(to) 수 있습니다.&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 150px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;&lt;b&gt;파일형식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;&lt;b&gt;Reader&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;&lt;b&gt;Writer&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;CSV&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;read_csv&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;to_csv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;EXCEL&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;read_excel&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;to_excel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;HTML&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;read_html&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;to_html&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;JSON&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;read_json&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;to_json&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;SQL&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;read_sql&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 25px;&quot;&gt;to_sql&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 정제 (Data Cleaning)&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;결측치(NaN/None)를 찾아 삭제하거나 다른 값으로 채우고, 데이터 타입을 변경하는 등 복잡한 전처리가 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 선택 및 필터링&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;특정 행이나 열을 선택하고, 조건문을 사용하여 원하는 데이터만 빠르게 추출. 즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;정제되지 않은 데이터를 정리하여 가독성과 연관성이 높은 데이터로 만들 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 병합 및 재구조화&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;여러 데이터를 하나로 합치거나(Merge/Join), 피벗 테이블(Pivot Table)을 만들어 데이터를 원하는 형태로 변환할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 집계 (Grouping)&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터를 특정 기준으로 그룹화하여 합계, 평균, 개수 등을 계산하는 연산에 탁월합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.&amp;nbsp; 작업 흐름&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;로드 (Load):&lt;/b&gt; 외부 데이터 파일을 불러옵니다. (pd.read_csv())&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;탐색 (Explore):&lt;/b&gt; 데이터의 형태나 요약 정보를 확인합니다. (df.head(), df.info(), df.describe())&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0&quot;&gt;전처리 (Clean/Transform):&lt;/b&gt; 불필요한 데이터를 지우거나 값을 보정합니다. (df.dropna(), df.rename())&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,3,0&quot;&gt;분석 (Analyze):&lt;/b&gt; 통계량을 계산하거나 그룹별 연산을 수행합니다. (df.groupby().mean())&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,4,0&quot;&gt;저장/출력 (Visualize/Export):&lt;/b&gt; 분석 결과를 파일로 저장하거나 시각화 도구(Matplotlib, Seaborn 등)와 연동합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치&lt;/p&gt;
&lt;pre id=&quot;code_1781682852509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install pandas&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용&lt;/p&gt;
&lt;pre id=&quot;code_1781682859839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Series(시리즈)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기본 구조(하나의 컬럼 데이터)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781683610409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;city = ['서울','부산','울산']
df = pd.Series(city)
'''
0    서울
1    부산
2    울산
dtype: str
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인덱싱&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781683766402&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 인덱스 변경 ( 0, 1, 2 -&amp;gt; a, b, c)
df = pd.Series(city, index = ['a','b','c'])
print(df)
print(df['a'])

# 시리즈 생성
city = {'서울': 940, '부산':330, '울산':110}
df = pd.Series(city)
print(df)
print(df['부산'])

# 시리즈 생성2
data = [10, 20, 30, 40]
index = ['a','b','c','d']
series = pd.Series(data, index=index)
print(series)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기본 통계량 계산 및 기본 명령&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781684112984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;Mean:&quot;, series.mean()) # 평균
print(&quot;Sum:&quot;, series.sum()) # 합계
print(&quot;Max:&quot;, series.max()) # 최댓값
print(&quot;Standard Deviation:&quot;, series.std()) # 표준편차

series['c'] # 인덱스'c'(위치)에 있는 원소

series &amp;gt; 20 # 조건 지정
'''
a    False
b    False
c     True
d     True
e     True
dtype: bool
'''

series[series &amp;gt; 20] # 조건에 맞는 값만 가져오기

series['c'] = 100 # 원소 수집(원소가 이미 있을 때)

series['e'] = 50 # 원소 추가(원소가 없을 때)

series = series.drop('a') # 원소 삭제
'''
b     20
c    100
d     40
e     50
dtype: int64
'''&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 인덱스 정렬 및 자동 매칭&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781684496939&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data2 = [5, 15, 25, 35]
series2 = pd.Series(data2, index=['b','c','d','e'])

result = series + series2
print(result)
'''
b     25
c    115
d     65
e     85
dtype: int64
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;핵심 원리:&lt;/b&gt; 판다스는 연산을 수행할 때 데이터의 위치(순서)가 아니라 &lt;b data-index-in-node=&quot;39&quot; data-path-to-node=&quot;4,0,0&quot;&gt;인덱스(Index) 이름을 기준으로 값을 찾아 더합니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;결과 분석:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 시리즈에 공통으로 존재하는 인덱스(b, c, d)는 값을 서로 더합니다.&lt;/li&gt;
&lt;li&gt;만약 한쪽에만 존재하는 인덱스(a는 series에만 있음, e는 series2에만 있음)는 더할 상대가 없으므로 결측값인 NaN (Not a Number)으로 처리됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,2,0&quot;&gt;결과:&lt;/b&gt; a: NaN, b: 25, c: 45, d: 65, e: NaN 순으로 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시계열 데이터 생성&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781684563605&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;date_range = pd.date_range(start='2023-01-01', periods=5)
print(date_range)
'''
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
               '2023-01-05'],
              dtype='datetime64[us]', freq='D')
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;핵심 원리:&lt;/b&gt; pd.date_range는 지정된 시작일로부터 규칙적인 간격(기본값은 일 단위)으로 날짜 인덱스를 자동으로 생성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;결과 분석:&lt;/b&gt; '2023-01-01'부터 시작하여 5일간의 날짜(2023-01-01 ~ 2023-01-05)를 가진 DatetimeIndex 객체가 생성됩니다. 이는 단순히 날짜 텍스트 리스트가 아니라, 날짜 계산이 가능한 전문 객체입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시계열 데이터 다루기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781684832308&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;time_series = pd.Series([1,3,5,7,9], index=date_range)
print(time_series)
print(time_series['2023-01-02'])
'''
2023-01-01    1
2023-01-02    3
2023-01-03    5
2023-01-04    7
2023-01-05    9
Freq: D, dtype: int64
3
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;핵심 원리:&lt;/b&gt; 시간 인덱스를 활용하면 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;10,0,0&quot;&gt;문자열 형태의 날짜로 직접 데이터에 접근&lt;/b&gt;할 수 있습니다. 굳이 인덱스 번호(0, 1, 2...)를 기억할 필요가 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;결과 분석:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;time_series['2023-01-02']와 같이 날짜 문자열을 넣어 호출하면, 해당 날짜에 대응하는 값인 3이 바로 반환됩니다.&lt;/li&gt;
&lt;li&gt;이는 데이터 분석 시 &quot;2023년 1월 2일의 매출이 얼마야?&quot;와 같은 질문에 매우 직관적으로 답할 수 있게 해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;** dtype, freq&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. dtype (Data Type, 데이터 타입)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;왜 중요한가요?&lt;/b&gt; 파이썬의 리스트와 달리, 판다스 시리즈는 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;4,0,0&quot;&gt;모든 요소가 동일한 데이터 타입&lt;/b&gt;을 가져야 합니다. 타입이 정해져 있어야 컴퓨터가 메모리를 효율적으로 쓰고 연산을 빠르게 수행할 수 있기 때문입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;주요 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;int64: 정수형 (64비트)&lt;/li&gt;
&lt;li&gt;float64: 실수형 (소수점이 있는 숫자)&lt;/li&gt;
&lt;li&gt;object: 문자열(String)이거나 여러 타입이 섞여 있을 때 주로 나타남&lt;/li&gt;
&lt;li&gt;datetime64[ns]: 날짜와 시간 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. freq (Frequency, 빈도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;왜 중요한가요?&lt;/b&gt; 데이터가 일정한 간격(매일, 매달, 매시간 등)으로 기록되었음을 판다스가 인지하고 있다는 뜻입니다. 이 정보를 알면 나중에 데이터를 리샘플링(Resampling)하거나 미래 날짜를 예측할 때 매우 유용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;주요 예시:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;freq='D': Day, 하루 단위&lt;/li&gt;
&lt;li&gt;freq='M': Month, 월 단위&lt;/li&gt;
&lt;li&gt;freq='H': Hour, 시간 단위&lt;/li&gt;
&lt;li&gt;freq='MS': Month Start, 월 시작일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;DataFrame(데이터 프레임)&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기본구조&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781685673778&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
city = {
	'도시': ['서울','부산','울산'],
	'인구': [940,330,110]
}

df = pd.DataFrame(city)
df

'''
	도시	인구
0	서울	940
1	부산	330
2	울산	110
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;데이터프레임으로 변환&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781685768962&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df = time_series.to_frame(name='Values')
# name = columns 하지만 to_frame()메서드에서는 columns라는 파라미터 존재 X
print(df)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;.loc VS .iloc&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;.loc (Label-based)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;.iloc (Integer-based)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0,0&quot;&gt;기준&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,1,1,0&quot;&gt;**이름(Label)**으로 접근&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,1,2,0&quot;&gt;**순서(Index 번호)**로 접근&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,2,0,0&quot;&gt;슬라이싱&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,2,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,2,1,0&quot;&gt;끝점 포함&lt;/b&gt; (0:2 &amp;rarr; 0, 1, 2)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,2,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,2,2,0&quot;&gt;끝점 미포함&lt;/b&gt; (0:2 &amp;rarr; 0, 1)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,3,0,0&quot;&gt;상황&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,3,1,0&quot;&gt;인덱스 이름이나 컬럼명을 알 때&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;3,3,2,0&quot;&gt;데이터의 몇 번째인지 위치를 알 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;.loc[행]&lt;/b&gt;: 인덱스 이름(Label)로 지정 (숫자 또는 문자, index 아님 주의)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;df.loc[0] # 시리즈 형태&lt;/li&gt;
&lt;li&gt;df.loc[[0]] # 데이터프레임 형태&lt;/li&gt;
&lt;li&gt;df.loc[[0,1,3]] # 여러 행을 한꺼번에 보려면 대괄호를 포함&lt;/li&gt;
&lt;li&gt;df.loc[0:3] # 슬라이싱을 이용할 때는 대괄호 제거
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;df.loc[0:3] # 0~3번 레이블까지를 의미 -&amp;gt; 4개의 데이터를 보여준다 (0, 1, 2, 3)&lt;/li&gt;
&lt;li&gt;df.iloc[0:3] # 0~3 index까지를 의미 -&amp;gt; 3개의 데이터를 보여준다. (0, 1, 2)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;.loc[행, 열]&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;df.loc[0, '성명'] # 시리즈 형태&lt;/li&gt;
&lt;li&gt;df.loc[[0],['성명']] # 데이터프레임 형태 (복수 개 사용시에는 반드시 대괄호 필요)&lt;/li&gt;
&lt;li&gt;df.loc[0:3, ['성명','급여']]&lt;/li&gt;
&lt;li&gt;df.loc[0:3, '성명':'급여'] # 슬라이싱 사용시 대괄호 반드시 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;.loc[조건, 열]&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;df.loc[df['급여']&amp;gt;=50000000] # '급여'컬럼의 데이터에서 5백만원 이상인 행&lt;/li&gt;
&lt;li&gt;df.loc[df['급여']&amp;gt;50000000, ['성명']] # '급여' 컬럼의 데이터에서 5백만원 이상인 행에 대해 '성명' 컬럼만&lt;/li&gt;
&lt;li&gt;파생 데이터 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;df['체질량']=''&quot; # 새로운 '체질량'이라는 빈 컬럼(열) 추가&lt;/li&gt;
&lt;li&gt;df.loc[df['몸무게']&amp;gt;80, ['체질량']] = '비만' #몸무게' 컬럼의 데이터에서 80이상인 행을 추출한 다음, 해당 행에 대해서만 '체질량' 컬럼에 '비만'을 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;.iloc&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.loc와 형식은 동일한데 loc달리 행과 컬럼의 index 정보로만 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인덱싱으로&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;df.iloc[[0,2], [0,3]]
df.iloc[:3, :2]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;복사&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;df2 = df.copy() # 원본 유지하면서 작업을 할 때 반드시 복사해서 작업&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;df['나이'] &amp;gt; 40
df[df['나이'] &amp;gt; 40]
df[df['나이'] &amp;gt; 40].index
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;df.drop( 행 인텍스 레이블), &lt;/b&gt;&lt;b&gt;df.drop(행, 열 인덱스, axis) # axis 생략 시 기본값은 0&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;df3 = df.drop(0) # 원본 삭제 x

df3.drop(['몸무게'], axis=1) # axis=0 은 행, axis=1 은 열
df.drop(df[df['나이'] &amp;gt; 40].index) # 특정 조건에 맞는 행만 삭제
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import pandas as pd

data = ['김예찬, m, 부장, 010-1234-5678, 서울시 강남구 삼성동',
'이하은, f, 인턴, 010-8765-4321, 부산시 해운대구 우동',
'박지현, f, 과장, 010-1357-2468, 대구시 수성구 범어동',
'최준호, m, 임시, 010-1928-3746, 인천시 연수구 송도동',
'김예서, f, 과장, 010-2846-5937, 천안시 서북구 두정동']

df = pd.DataFrame(data,columns=['직원데이터'])
df = df['직원데이터'].str.split(',',expand=True)
# expand=False(기본값): 결과를 '리스트' 형태로 반환
# exapnd=True: 결과를 '데이터프레임' 형태로 반환

df.columns = ['이름','성별','직급','전화번호','주소']
# df['성별'].str.replace('M','Male') # 수정된 새로운 결과물을 반환하기 때문에 새로운 변수에 저장
df['성별']=df['성별'].str.upper()
df['성별']=df['성별'].str.replace('M','Male')
df['성별']=df['성별'].str.replace('F','Female')
df['성별']=df['성별'].str.replace('Male','남성').str.replace('Female','여성')
df

df['직급'].unique() # 하나만 있는 값 확인
df['직급'] = df['직급'].str.replace('인턴|임시','사원', regex=True)

df

df['직급'].unique()
df['주소'] = df['주소'].str.strip() # 양끝 공백 제거
df[['시','구','동']] = df['주소'].str.split(' ', expand=True)
df.drop(['주소'], axis=1) #열 제거&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;regex=True의 역할&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;코드에서 사용하신 '인턴|임시' 부분에서 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;2&quot;&gt;| (파이프)&lt;/b&gt; 기호가 바로 핵심입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;| 기호의 의미:&lt;/b&gt; 파이썬이나 정규식에서 '또는(OR)'을 의미합니다.&lt;/li&gt;
&lt;li&gt;즉, '인턴|임시'는 &quot;인턴이거나, 혹은 임시인 글자를 찾아라&quot;라는 뜻입니다.&lt;/li&gt;
&lt;li&gt;regex=True를 설정하면 판다스는 이 '|'를 단순한 문자가 아니라 '논리 연산자'로 인식하여, 해당 패턴에 맞는 모든 단어를 '사원'으로 바꿔줍니다.&lt;/li&gt;
&lt;li&gt;정규식 패턴 예시&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;패턴&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;활용 예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0,0&quot;&gt;^A&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,1,1,0&quot;&gt;A로 시작하는 문자열&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,1,2,0&quot;&gt;^김 (김씨로 시작하는 사람)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0,0&quot;&gt;A$&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,2,1,0&quot;&gt;A로 끝나는 문자열&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,2,2,0&quot;&gt;님$ (님으로 끝나는 이름)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,3,0,0&quot;&gt;[0-9]&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,3,1,0&quot;&gt;숫자 0부터 9까지&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,3,2,0&quot;&gt;숫자만 포함된 데이터 필터링&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,4,0,0&quot;&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,4,1,0&quot;&gt;아무 글자 하나&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;12,4,2,0&quot;&gt;패턴의 중간 글자 생략 시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/66</guid>
      <comments>https://cd-record.tistory.com/66#entry66comment</comments>
      <pubDate>Wed, 17 Jun 2026 18:13:26 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.16) Matplotlib</title>
      <link>https://cd-record.tistory.com/65</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;Matplotlib&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Matplotlib이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬에서 정적, 애니메이션, 대화형 데이터 시각화를 만들기 위해 가장 널리 사용되는 오픈소스 플로팅 라이브러리입니다. 2D 및 3D 그래픽을 모두 지원하며, 학술 논문용 고품질 그래프부터 간단한 데이터 탐색용 차트까지 다양한 시각화 결과물을 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot; data-hveid=&quot;CAIIAAgOEAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;다양한 그래프 지원&lt;/b&gt;: 선 그래프, 산점도, 히스토그램, 막대 그래프, 파이 차트 등을 그릴 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot; data-hveid=&quot;CAIIAAgOEAE&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;뛰어난 호환성&lt;/b&gt;: Numpy 배열이나 Pandas 데이터프레임과 완벽하게 연동됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot; data-hveid=&quot;CAIIAAgOEAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;세밀한 커스터마이징&lt;/b&gt;: 축, 라벨, 범례, 색상 등 그래프의 모든 시각적 요소를 직접 제어할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sae=&quot;&quot; data-hveid=&quot;CAIIAAgOEAU&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;ep&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;여러 포맷 저장&lt;/b&gt;: 완성된 그래프를 PNG, JPG, PDF, SVG 등의 파일로 내보낼 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;설치&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install matplotlib&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
import numpy as np&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;200&quot; data-start=&quot;178&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 선 그래프 (Line Plot)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [1,4,9,16]

plt.plot(x, y)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;331&quot; data-start=&quot;322&quot; data-ke-size=&quot;size20&quot;&gt;스타일 지정&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.plot(x, y,
         color='red',
         linestyle='--',
         marker='o')

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px; color: #000000; font-size: 1.25em;&quot;&gt;옵션설명&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;527&quot; data-start=&quot;443&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;527&quot; data-start=&quot;461&quot;&gt;
&lt;tr data-end=&quot;473&quot; data-start=&quot;461&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;467&quot; data-start=&quot;461&quot;&gt;color&lt;/td&gt;
&lt;td data-end=&quot;473&quot; data-start=&quot;467&quot; data-col-size=&quot;sm&quot;&gt;선 색상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;491&quot; data-start=&quot;474&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;484&quot; data-start=&quot;474&quot;&gt;linestyle&lt;/td&gt;
&lt;td data-end=&quot;491&quot; data-start=&quot;484&quot; data-col-size=&quot;sm&quot;&gt;선 스타일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;510&quot; data-start=&quot;492&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;499&quot; data-start=&quot;492&quot;&gt;marker&lt;/td&gt;
&lt;td data-end=&quot;510&quot; data-start=&quot;499&quot; data-col-size=&quot;sm&quot;&gt;데이터 표시 모양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;527&quot; data-start=&quot;511&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;521&quot; data-start=&quot;511&quot;&gt;linewidth&lt;/td&gt;
&lt;td data-end=&quot;527&quot; data-start=&quot;521&quot; data-col-size=&quot;sm&quot;&gt;선 두께&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;532&quot; data-start=&quot;529&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;547&quot; data-start=&quot;534&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 제목과 축 라벨&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;plt.plot(x, y)

plt.title(&quot;성적 변화&quot;)
plt.xlabel(&quot;시험 횟수&quot;)
plt.ylabel(&quot;점수&quot;)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;669&quot; data-start=&quot;666&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;686&quot; data-start=&quot;671&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 범례(Legend)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;688&quot; data-ke-size=&quot;size16&quot;&gt;그래프가 여러 개일 때 사용&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;plt.plot([1,2,3], [2,4,6], label=&quot;A반&quot;)
plt.plot([1,2,3], [1,3,5], label=&quot;B반&quot;)

plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;832&quot; data-start=&quot;823&quot; data-ke-size=&quot;size20&quot;&gt;위치 지정&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.legend(loc='upper left')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;888&quot; data-start=&quot;878&quot; data-ke-size=&quot;size16&quot;&gt;자주 사용하는 위치&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;950&quot; data-start=&quot;890&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;896&quot; data-start=&quot;890&quot;&gt;best&lt;/li&gt;
&lt;li data-end=&quot;910&quot; data-start=&quot;897&quot;&gt;upper right&lt;/li&gt;
&lt;li data-end=&quot;923&quot; data-start=&quot;911&quot;&gt;upper left&lt;/li&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;924&quot;&gt;lower right&lt;/li&gt;
&lt;li data-end=&quot;950&quot; data-start=&quot;938&quot;&gt;lower left&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;955&quot; data-start=&quot;952&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;969&quot; data-start=&quot;957&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 축 범위 지정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;983&quot; data-start=&quot;971&quot; data-ke-size=&quot;size16&quot;&gt;그래프 표시 범위 설정&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;plt.plot(x, y)

plt.xlim(0, 5)
plt.ylim(0, 20)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1061&quot; data-start=&quot;1059&quot; data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;plt.axis([0,5,0,20])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# [xmin, xmax, ymin, ymax]
plt.axis([0,5,0,20])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1165&quot; data-start=&quot;1162&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1180&quot; data-start=&quot;1167&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 격자(Grid)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1195&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size16&quot;&gt;데이터 보기 쉽게 만들기&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;plt.plot(x, y)

plt.grid(True)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1262&quot; data-start=&quot;1255&quot; data-ke-size=&quot;size18&quot;&gt;Y축만&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.grid(True, axis='y')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1311&quot; data-start=&quot;1304&quot; data-ke-size=&quot;size20&quot;&gt;투명도&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.grid(True,
         linestyle='--',
         alpha=0.5)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1391&quot; data-start=&quot;1388&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1407&quot; data-start=&quot;1393&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 눈금(Ticks)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1416&quot; data-start=&quot;1409&quot; data-ke-size=&quot;size16&quot;&gt;축 눈금 변경&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;plt.xticks([1,2,3],
           ['1월','2월','3월'])

plt.yticks([0,50,100])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1508&quot; data-start=&quot;1506&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1월  2월  3월&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1537&quot; data-start=&quot;1534&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1556&quot; data-start=&quot;1539&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. Figure 크기 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1567&quot; data-start=&quot;1558&quot; data-ke-size=&quot;size16&quot;&gt;그래프 전체 크기&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;plt.figure(figsize=(10,6))

plt.plot(x,y)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 가로 10인치
# 세로 6인치&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1674&quot; data-start=&quot;1671&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1699&quot; data-start=&quot;1676&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. 막대 그래프 (Bar Chart)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1708&quot; data-start=&quot;1701&quot; data-ke-size=&quot;size16&quot;&gt;카테고리 비교&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;years = ['2018','2019','2020']
values = [100,400,900]

plt.bar(years, values)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1824&quot; data-start=&quot;1815&quot; data-ke-size=&quot;size20&quot;&gt;색상 지정&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;plt.bar(years,
        values,
        color=['red','green','blue'])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1913&quot; data-start=&quot;1910&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1929&quot; data-start=&quot;1915&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9. 가로 막대 그래프&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;plt.barh(years, values)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1985&quot; data-start=&quot;1982&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2011&quot; data-start=&quot;1987&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10. 산점도 (Scatter Plot)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2022&quot; data-start=&quot;2013&quot; data-ke-size=&quot;size16&quot;&gt;데이터 분포 확인&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;import numpy as np

x = np.random.rand(50)
y = np.random.rand(50)

plt.scatter(x, y)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2147&quot; data-start=&quot;2136&quot; data-ke-size=&quot;size20&quot;&gt;점 크기 지정&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;plt.scatter(x, y,
            s=100)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;옵션설명&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2236&quot; data-start=&quot;2201&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2236&quot; data-start=&quot;2219&quot;&gt;
&lt;tr data-end=&quot;2227&quot; data-start=&quot;2219&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2221&quot; data-start=&quot;2219&quot;&gt;s&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2227&quot; data-start=&quot;2221&quot;&gt;점 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2236&quot; data-start=&quot;2228&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2230&quot; data-start=&quot;2228&quot;&gt;c&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2236&quot; data-start=&quot;2230&quot;&gt;점 색상&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2241&quot; data-start=&quot;2238&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2266&quot; data-start=&quot;2243&quot; data-ke-size=&quot;size23&quot;&gt;11. 히스토그램 (Histogram)&lt;/h3&gt;
&lt;p data-end=&quot;2278&quot; data-start=&quot;2268&quot; data-ke-size=&quot;size16&quot;&gt;데이터 빈도수 확인&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;scores = [60,70,80,90,80,75,65]

plt.hist(scores)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2369&quot; data-start=&quot;2357&quot; data-ke-size=&quot;size18&quot;&gt;구간 개수 지정&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.hist(scores,
         bins=5)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2423&quot; data-start=&quot;2420&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2448&quot; data-start=&quot;2425&quot; data-ke-size=&quot;size23&quot;&gt;12. 파이 차트 (Pie Chart)&lt;/h3&gt;
&lt;p data-end=&quot;2455&quot; data-start=&quot;2450&quot; data-ke-size=&quot;size16&quot;&gt;비율 표현&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;ratio = [40,30,20,10]
labels = ['A','B','C','D']

plt.pie(ratio,
        labels=labels)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2582&quot; data-start=&quot;2572&quot; data-ke-size=&quot;size20&quot;&gt;퍼센트 표시&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.pie(ratio,
        labels=labels,
        autopct='%.1f%%')

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2678&quot; data-start=&quot;2675&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2705&quot; data-start=&quot;2680&quot; data-ke-size=&quot;size23&quot;&gt;13. 여러 그래프 출력 (subplot)&lt;/h3&gt;
&lt;p data-end=&quot;2719&quot; data-start=&quot;2707&quot; data-ke-size=&quot;size16&quot;&gt;한 화면에 여러 그래프&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;plt.subplot(1,2,1)

plt.plot([1,2,3],[1,4,9])

plt.subplot(1,2,2)

plt.plot([1,2,3],[9,4,1])

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;subplot(행, 열, 위치)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2880&quot; data-start=&quot;2874&quot; data-ke-size=&quot;size18&quot;&gt;예시&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;plt.subplot(2,1,1)
plt.plot(...)

plt.subplot(2,1,2)
plt.plot(...)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2970&quot; data-start=&quot;2964&quot; data-ke-size=&quot;size16&quot;&gt;위아래 배치&lt;/p&gt;
&lt;hr data-end=&quot;2975&quot; data-start=&quot;2972&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2989&quot; data-start=&quot;2977&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;14. 그래프 저장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3001&quot; data-start=&quot;2991&quot; data-ke-size=&quot;size16&quot;&gt;이미지 파일로 저장&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;plt.plot([1,2,3],[1,4,9])

plt.savefig(&quot;graph.png&quot;)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3092&quot; data-start=&quot;3082&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해상도 지정&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;plt.savefig(&quot;graph.png&quot;,
            dpi=300)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3158&quot; data-start=&quot;3155&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3172&quot; data-start=&quot;3160&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;자주 사용하는 마커&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;마커모양
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3234&quot; data-start=&quot;3174&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3234&quot; data-start=&quot;3192&quot;&gt;
&lt;tr data-end=&quot;3197&quot; data-start=&quot;3192&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3194&quot; data-start=&quot;3192&quot;&gt;o&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3197&quot; data-start=&quot;3194&quot;&gt;원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3205&quot; data-start=&quot;3198&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3200&quot; data-start=&quot;3198&quot;&gt;s&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3205&quot; data-start=&quot;3200&quot;&gt;사각형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3213&quot; data-start=&quot;3206&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3208&quot; data-start=&quot;3206&quot;&gt;^&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3213&quot; data-start=&quot;3208&quot;&gt;삼각형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3220&quot; data-start=&quot;3214&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3216&quot; data-start=&quot;3214&quot;&gt;x&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3220&quot; data-start=&quot;3216&quot;&gt;엑스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3226&quot; data-start=&quot;3221&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3223&quot; data-start=&quot;3221&quot;&gt;*&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3226&quot; data-start=&quot;3223&quot;&gt;별&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3234&quot; data-start=&quot;3227&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3229&quot; data-start=&quot;3227&quot;&gt;d&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3234&quot; data-start=&quot;3229&quot;&gt;마름모&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;plt.plot(x, y, marker='o')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3281&quot; data-start=&quot;3278&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3298&quot; data-start=&quot;3283&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;자주 사용하는 선 스타일&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;스타일설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3352&quot; data-start=&quot;3300&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3352&quot; data-start=&quot;3319&quot;&gt;
&lt;tr data-end=&quot;3325&quot; data-start=&quot;3319&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3321&quot; data-start=&quot;3319&quot;&gt;-&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3325&quot; data-start=&quot;3321&quot;&gt;실선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3333&quot; data-start=&quot;3326&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3329&quot; data-start=&quot;3326&quot;&gt;--&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3333&quot; data-start=&quot;3329&quot;&gt;점선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3341&quot; data-start=&quot;3334&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3336&quot; data-start=&quot;3334&quot;&gt;:&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3341&quot; data-start=&quot;3336&quot;&gt;도트선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3352&quot; data-start=&quot;3342&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3345&quot; data-start=&quot;3342&quot;&gt;-.&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3352&quot; data-start=&quot;3345&quot;&gt;점-대시선&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;plt.plot(x, y, '--')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3393&quot; data-start=&quot;3390&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;3413&quot; data-start=&quot;3395&quot; data-ke-size=&quot;size20&quot;&gt;ex) 실무에서 가장 많이 쓰는 패턴&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,6)
y = [10,20,15,30,25]

plt.figure(figsize=(8,5))

plt.plot(x, y,
         marker='o',
         linestyle='--',
         color='blue',
         label='매출')

plt.title(&quot;월별 매출&quot;)
plt.xlabel(&quot;월&quot;)
plt.ylabel(&quot;매출&quot;)

plt.grid(True, alpha=0.3)
plt.legend()

plt.tight_layout()

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;3783&quot; data-start=&quot;3780&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3801&quot; data-start=&quot;3785&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;plt.plot()      # 선 그래프
plt.bar()       # 막대 그래프
plt.barh()      # 가로 막대 그래프
plt.scatter()   # 산점도
plt.hist()      # 히스토그램
plt.pie()       # 파이 차트

plt.title()     # 제목
plt.xlabel()    # x축 이름
plt.ylabel()    # y축 이름

plt.legend()    # 범례
plt.grid()      # 격자

plt.xlim()      # x축 범위
plt.ylim()      # y축 범위

plt.subplot()   # 여러 그래프
plt.savefig()   # 이미지 저장
plt.show()      # 그래프 출력&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/65</guid>
      <comments>https://cd-record.tistory.com/65#entry65comment</comments>
      <pubDate>Wed, 17 Jun 2026 00:04:51 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.15) NumPy</title>
      <link>https://cd-record.tistory.com/64</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;NumPy(Numerical Python)&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. NumPy란??&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;337&quot; data-start=&quot;241&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NumPy는 Numerical Python의 약자로 과학 및 공학 분야에서 사용되는 오픈 소스 파이썬 라이브러리이다.&lt;/li&gt;
&lt;li&gt;NumPy 라이브러리에는 다차원 배열 및 행렬 데이터 구조가 포함되어있다.&lt;/li&gt;
&lt;li&gt;NumPy는 배열로 저장된 값에 대한 수학 연산을 수행하는데 사용된다.&lt;/li&gt;
&lt;li&gt;특징
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-section-id=&quot;1uo6njs&quot; data-start=&quot;241&quot; data-end=&quot;259&quot;&gt;다차원 배열(Array) 지원&lt;/li&gt;
&lt;li data-section-id=&quot;1kcy54k&quot; data-start=&quot;260&quot; data-end=&quot;273&quot;&gt;빠른 수학 연산 가능&lt;/li&gt;
&lt;li data-section-id=&quot;1i805rf&quot; data-start=&quot;274&quot; data-end=&quot;297&quot;&gt;벡터화(Vectorization) 지원&lt;/li&gt;
&lt;li data-section-id=&quot;kv1ggt&quot; data-start=&quot;298&quot; data-end=&quot;337&quot;&gt;Pandas, Matplotlib 등 데이터 분석 라이브러리의 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;259&quot; data-start=&quot;241&quot; data-section-id=&quot;1uo6njs&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;설치&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install numpy&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;376&quot; data-start=&quot;374&quot;&gt;사용&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import numpy as np&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;415&quot; data-start=&quot;412&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;438&quot; data-start=&quot;417&quot; data-section-id=&quot;hobedp&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 리스트와 NumPy 배열 차이&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;449&quot; data-start=&quot;440&quot; data-section-id=&quot;11oym6p&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;일반 리스트&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;a = [1, 3, 5]
b = [2, 4, 6]

print(a + b)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;510&quot; data-start=&quot;508&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[1, 3, 5, 2, 4, 6]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;575&quot; data-start=&quot;546&quot; data-ke-size=&quot;size16&quot;&gt;리스트는 연결(Concatenation)만 수행한다.&lt;/p&gt;
&lt;h4 data-end=&quot;593&quot; data-start=&quot;582&quot; data-section-id=&quot;1i3dd6m&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;NumPy 배열&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;a = np.array([1, 3, 5])
b = np.array([2, 4, 6])

print(a + b)
print(a * b)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;687&quot; data-start=&quot;685&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[3 7 11]
[2 12 30]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;747&quot; data-start=&quot;723&quot; data-ke-size=&quot;size16&quot;&gt;NumPy는 같은 위치의 원소끼리 계산한다.&lt;/p&gt;
&lt;p data-end=&quot;792&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;이를 &lt;b&gt;벡터화 연산(Vectorized Operation)&lt;/b&gt; 이라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;792&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;804&quot; data-start=&quot;794&quot; data-ke-size=&quot;size16&quot;&gt;⭐ &lt;b&gt;시험/실무 중요&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;a + b
a - b
a * b
a / b&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;858&quot; data-start=&quot;845&quot; data-ke-size=&quot;size16&quot;&gt;모두 한 번에 계산 가능&lt;/p&gt;
&lt;hr data-end=&quot;863&quot; data-start=&quot;860&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;882&quot; data-start=&quot;865&quot; data-section-id=&quot;xknsc&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. ndarray(n차원 배열) 생성하기&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;865&quot; data-section-id=&quot;xknsc&quot;&gt;&lt;b&gt;스칼라&lt;/b&gt;: 0차원 배열&lt;/li&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;865&quot; data-section-id=&quot;xknsc&quot;&gt;&lt;b&gt;벡터&lt;/b&gt;: 1차원 배열&lt;/li&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;865&quot; data-section-id=&quot;xknsc&quot;&gt;&lt;b&gt;매트릭스(행렬)&lt;/b&gt;: 2차원 배열&lt;/li&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;865&quot; data-section-id=&quot;xknsc&quot;&gt;&lt;b&gt;텐서&lt;/b&gt;: 3차원 배열&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;894&quot; data-start=&quot;884&quot; data-section-id=&quot;1sr8g2l&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;array()&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([1,2,3])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;950&quot; data-start=&quot;940&quot; data-section-id=&quot;rh6jxx&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;zeros()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;964&quot; data-start=&quot;952&quot; data-ke-size=&quot;size16&quot;&gt;모든 값을 0으로 생성&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.zeros(5)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;995&quot; data-start=&quot;993&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[0. 0. 0. 0. 0.]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1043&quot; data-start=&quot;1034&quot; data-section-id=&quot;1kos777&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ones()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1056&quot; data-start=&quot;1045&quot; data-ke-size=&quot;size16&quot;&gt;모든 값을 1로 생성&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.ones(5)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1099&quot; data-start=&quot;1089&quot; data-section-id=&quot;182uv0x&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;empty()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1108&quot; data-start=&quot;1101&quot; data-ke-size=&quot;size16&quot;&gt;빈 배열 생성&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.empty(5)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1149&quot; data-start=&quot;1137&quot; data-ke-size=&quot;size16&quot;&gt;초기값은 랜덤 쓰레기값&lt;/p&gt;
&lt;h4 data-end=&quot;1167&quot; data-start=&quot;1156&quot; data-section-id=&quot;jk4kre&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;arange()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1174&quot; data-start=&quot;1169&quot; data-ke-size=&quot;size16&quot;&gt;범위 생성&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.arange(5)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1206&quot; data-start=&quot;1204&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[0 1 2 3 4]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;범위 생성&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.arange(2,20,3)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1275&quot; data-start=&quot;1273&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[ 2 5 8 11 14 17 ]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1329&quot; data-start=&quot;1316&quot; data-section-id=&quot;1rsdxxn&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;linspace()&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1339&quot; data-start=&quot;1331&quot; data-ke-size=&quot;size16&quot;&gt;균등 간격 생성&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.linspace(0,100,num=5)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1383&quot; data-start=&quot;1381&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[  0.  25.  50.  75. 100.]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1434&quot; data-start=&quot;1427&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1439&quot; data-start=&quot;1436&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1455&quot; data-start=&quot;1441&quot; data-section-id=&quot;1kzdh1c&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 데이터 타입 확인&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([2,4,6,8])

print(arr.dtype)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1518&quot; data-start=&quot;1516&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int64&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1558&quot; data-start=&quot;1546&quot; data-section-id=&quot;1ubtap1&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Upcasting&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1581&quot; data-start=&quot;1560&quot; data-ke-size=&quot;size16&quot;&gt;서로 다른 자료형이 있으면 자동 형변환&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;arr = np.array(['서울', '부산', 123])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1634&quot; data-start=&quot;1632&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;['서울' '부산' '123']&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1683&quot; data-start=&quot;1669&quot; data-ke-size=&quot;size16&quot;&gt;숫자가 문자열로 변환된다.&lt;/p&gt;
&lt;hr data-end=&quot;1688&quot; data-start=&quot;1685&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1703&quot; data-start=&quot;1690&quot; data-section-id=&quot;1i1xpdh&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 배열 정보 확인&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([[1,2,3],[4,5,6]])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1762&quot; data-start=&quot;1754&quot; data-section-id=&quot;y8uuui&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;shape&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1769&quot; data-start=&quot;1764&quot; data-ke-size=&quot;size16&quot;&gt;배열 형태&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;arr.shape&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1798&quot; data-start=&quot;1796&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;(2,3)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1826&quot; data-start=&quot;1821&quot; data-ke-size=&quot;size16&quot;&gt;2행 3열&lt;/p&gt;
&lt;h4 data-end=&quot;1840&quot; data-start=&quot;1833&quot; data-section-id=&quot;1xwvbez&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ndim&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1846&quot; data-start=&quot;1842&quot; data-ke-size=&quot;size16&quot;&gt;차원 수&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;arr.ndim&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1874&quot; data-start=&quot;1872&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;1905&quot; data-start=&quot;1898&quot; data-section-id=&quot;1xwzdc0&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;size&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1914&quot; data-start=&quot;1907&quot; data-ke-size=&quot;size16&quot;&gt;전체 원소 수&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;arr.size&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1942&quot; data-start=&quot;1940&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;6&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1964&quot; data-start=&quot;1961&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1981&quot; data-start=&quot;1966&quot; data-section-id=&quot;1w6ljpm&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 배열 차원 이해하기&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1998&quot; data-start=&quot;1983&quot; data-section-id=&quot;12qmdfm&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;0차원 (Scalar)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.array(12)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2048&quot; data-start=&quot;2033&quot; data-section-id=&quot;1cd8hpw&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1차원 (Vector)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.array([1,2,3])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2103&quot; data-start=&quot;2088&quot; data-section-id=&quot;34knbp&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2차원 (Matrix)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.array([
 [1,2,3],
 [4,5,6]
])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2173&quot; data-start=&quot;2158&quot; data-section-id=&quot;1f642xq&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3차원 (Tensor)&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;np.array([
 [[1,2,3],[4,5,6]],
 [[7,8,9],[10,11,12]]
])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2249&quot; data-start=&quot;2246&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2259&quot; data-start=&quot;2251&quot; data-section-id=&quot;llayxz&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 인덱싱&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;2267&quot; data-start=&quot;2261&quot; data-section-id=&quot;1hrpx58&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1차원&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([2,4,6,8])

print(arr[0])
print(arr[-1])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2342&quot; data-start=&quot;2340&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;2
8&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2374&quot; data-start=&quot;2368&quot; data-section-id=&quot;1hrq233&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2차원&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([
 [2,4,6],
 [1,3,5]
])

print(arr[1,1])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2449&quot; data-start=&quot;2447&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;2479&quot; data-start=&quot;2473&quot; data-section-id=&quot;1hrpy8e&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3차원&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr[1,1,2]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2509&quot; data-start=&quot;2507&quot; data-ke-size=&quot;size16&quot;&gt;처럼&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[깊이, 행, 열]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2546&quot; data-start=&quot;2537&quot; data-ke-size=&quot;size16&quot;&gt;순서로 접근한다.&lt;/p&gt;
&lt;hr data-end=&quot;2551&quot; data-start=&quot;2548&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2562&quot; data-start=&quot;2553&quot; data-section-id=&quot;126no91&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. 슬라이싱&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([10,11,12,13,14,15])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2619&quot; data-start=&quot;2615&quot; data-ke-size=&quot;size16&quot;&gt;앞 3개&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr[:3]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2655&quot; data-start=&quot;2649&quot; data-ke-size=&quot;size16&quot;&gt;4번부터 끝&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr[4:]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2688&quot; data-start=&quot;2685&quot; data-ke-size=&quot;size16&quot;&gt;중간만&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr[2:5]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2717&quot; data-start=&quot;2714&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2738&quot; data-start=&quot;2719&quot; data-section-id=&quot;1nm0z80&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9. 조건 필터링&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2748&quot; data-start=&quot;2740&quot; data-section-id=&quot;1q6bgmg&quot; data-ke-size=&quot;size16&quot;&gt;조건 검색&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([1,2,3,4,5])

print(arr[arr &amp;gt; 3])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2816&quot; data-start=&quot;2814&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[4 5]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2849&quot; data-start=&quot;2844&quot; data-ke-size=&quot;size16&quot;&gt;짝수 찾기&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr[arr % 2 == 0]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2886&quot; data-start=&quot;2884&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[2 4]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2919&quot; data-start=&quot;2914&quot; data-ke-size=&quot;size16&quot;&gt;범위 검색&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr[(arr &amp;gt; 3) &amp;amp; (arr &amp;lt; 9)]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2967&quot; data-start=&quot;2963&quot; data-ke-size=&quot;size16&quot;&gt;⭐ 중요&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&amp;amp;
|&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2990&quot; data-start=&quot;2988&quot; data-ke-size=&quot;size16&quot;&gt;사용&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;and
or&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3019&quot; data-start=&quot;3014&quot; data-ke-size=&quot;size16&quot;&gt;사용 불가&lt;/p&gt;
&lt;hr data-end=&quot;3024&quot; data-start=&quot;3021&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3037&quot; data-start=&quot;3026&quot; data-section-id=&quot;1xe7c3s&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;10. 통계 함수&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;3044&quot; data-start=&quot;3039&quot; data-section-id=&quot;1m8bxo&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;평균&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;np.mean(arr)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3084&quot; data-start=&quot;3079&quot; data-section-id=&quot;1m81rc&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;합계&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;np.sum(arr)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3124&quot; data-start=&quot;3118&quot; data-section-id=&quot;1hh3suj&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;최대값&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;np.max(arr)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3164&quot; data-start=&quot;3158&quot; data-section-id=&quot;1hhhvif&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;최소값&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;np.min(arr)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3210&quot; data-start=&quot;3198&quot; data-section-id=&quot;jm3kix&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;NaN 제외 평균&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;np.nanmean(arr)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3259&quot; data-start=&quot;3243&quot; data-ke-size=&quot;size16&quot;&gt;⭐ 데이터 분석에서 자주 사용&lt;/p&gt;
&lt;hr data-end=&quot;3264&quot; data-start=&quot;3261&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3286&quot; data-start=&quot;3266&quot; data-section-id=&quot;1a9yr1j&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;11. axis 이해하기&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;scores = np.array([
 [85,90,88,95],
 [92,87,85,89],
 [78,85,91,87]
])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3387&quot; data-start=&quot;3378&quot; data-section-id=&quot;1jtm2a3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;axis=0 (행축): 세로 방향 (열끼리 묶음)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3396&quot; data-start=&quot;3389&quot; data-ke-size=&quot;size16&quot;&gt;열 기준 계산&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;np.mean(scores, axis=0)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3439&quot; data-start=&quot;3437&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;과목별 평균&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3477&quot; data-start=&quot;3468&quot; data-section-id=&quot;1jtm2a2&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;axis=1 (열축): 가로 방향 (행끼리 묶음)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3486&quot; data-start=&quot;3479&quot; data-ke-size=&quot;size16&quot;&gt;행 기준 계산&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;np.mean(scores, axis=1)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3529&quot; data-start=&quot;3527&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;학생별 평균&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-end=&quot;3563&quot; data-start=&quot;3558&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;⭐ 외우기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;axis=0 &amp;rarr; 세로
axis=1 &amp;rarr; 가로&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3607&quot; data-start=&quot;3604&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3624&quot; data-start=&quot;3609&quot; data-section-id=&quot;fpfi9e&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;12. reshape()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3634&quot; data-start=&quot;3626&quot; data-ke-size=&quot;size16&quot;&gt;배열 형태 변경&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.arange(1,13)

arr.reshape(3,4)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3693&quot; data-start=&quot;3691&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;3행 4열&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;배열 형태 변경&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr.reshape(2,6)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3755&quot; data-start=&quot;3753&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;2행 6열&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3781&quot; data-start=&quot;3778&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3798&quot; data-start=&quot;3783&quot; data-section-id=&quot;y91mtn&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;13. flatten()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3815&quot; data-start=&quot;3800&quot; data-ke-size=&quot;size16&quot;&gt;다차원 배열 &amp;rarr; 1차원 배열&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;arr.flatten()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3849&quot; data-start=&quot;3846&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3879&quot; data-start=&quot;3851&quot; data-section-id=&quot;tt47vo&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;14. np.where()&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;3895&quot; data-start=&quot;3881&quot; data-section-id=&quot;mrwxn6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;조건에 따라 값 변경&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;np.where(arr &amp;gt; 5, &quot;합격&quot;, &quot;불합격&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3945&quot; data-start=&quot;3943&quot; data-ke-size=&quot;size16&quot;&gt;결과&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;조건 참 &amp;rarr; 합격
조건 거짓 &amp;rarr; 불합격&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3997&quot; data-start=&quot;3989&quot; data-section-id=&quot;oph0bs&quot; data-ke-size=&quot;size18&quot;&gt;실제 활용&lt;/p&gt;
&lt;p data-end=&quot;4004&quot; data-start=&quot;3999&quot; data-ke-size=&quot;size16&quot;&gt;재고 관리&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;status = np.where(
    inventory &amp;gt;= 30,
    &quot;충분&quot;,
    &quot;부족&quot;
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4085&quot; data-start=&quot;4082&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;4122&quot; data-start=&quot;4087&quot; data-section-id=&quot;1bn7s3y&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;** 실무에서 가장 많이 쓰는 NumPy 함수 TOP 10&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;함수용도
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;4388&quot; data-start=&quot;4124&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;4388&quot; data-start=&quot;4156&quot;&gt;
&lt;tr data-end=&quot;4178&quot; data-start=&quot;4156&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4169&quot; data-start=&quot;4156&quot;&gt;np.array()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4178&quot; data-start=&quot;4169&quot;&gt;배열 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4202&quot; data-start=&quot;4179&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4193&quot; data-start=&quot;4179&quot;&gt;np.arange()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4202&quot; data-start=&quot;4193&quot;&gt;범위 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4231&quot; data-start=&quot;4203&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4219&quot; data-start=&quot;4203&quot;&gt;np.linspace()&lt;/td&gt;
&lt;td data-end=&quot;4231&quot; data-start=&quot;4219&quot; data-col-size=&quot;sm&quot;&gt;균등 간격 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4253&quot; data-start=&quot;4232&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4245&quot; data-start=&quot;4232&quot;&gt;np.zeros()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4253&quot; data-start=&quot;4245&quot;&gt;0 배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4274&quot; data-start=&quot;4254&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4266&quot; data-start=&quot;4254&quot;&gt;np.ones()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4274&quot; data-start=&quot;4266&quot;&gt;1 배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4293&quot; data-start=&quot;4275&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4287&quot; data-start=&quot;4275&quot;&gt;np.mean()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4293&quot; data-start=&quot;4287&quot;&gt;평균&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4311&quot; data-start=&quot;4294&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4305&quot; data-start=&quot;4294&quot;&gt;np.sum()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4311&quot; data-start=&quot;4305&quot;&gt;합계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4334&quot; data-start=&quot;4312&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4325&quot; data-start=&quot;4312&quot;&gt;np.where()&lt;/td&gt;
&lt;td data-end=&quot;4334&quot; data-start=&quot;4325&quot; data-col-size=&quot;sm&quot;&gt;조건 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4359&quot; data-start=&quot;4335&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4350&quot; data-start=&quot;4335&quot;&gt;np.reshape()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4359&quot; data-start=&quot;4350&quot;&gt;형태 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;4388&quot; data-start=&quot;4360&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4375&quot; data-start=&quot;4360&quot;&gt;np.nanmean()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;4388&quot; data-start=&quot;4375&quot;&gt;NaN 제외 평균&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;느낀점&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 numpy에 대해 배웠다. 데이터를 만지는데 기초에 들어섰다. 예전에 학교 수업을 들으면서 잠깐 사용한 기억은 있지만 그 당시 너무 기초만 사용해보았고 너무 오래되었던 기억이라 새로 한다는 생각으로 수업을 따라가야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/64</guid>
      <comments>https://cd-record.tistory.com/64#entry64comment</comments>
      <pubDate>Mon, 15 Jun 2026 18:01:07 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.11) JWT 기반 인증</title>
      <link>https://cd-record.tistory.com/62</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;JWT&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 인증(Authentication)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증은 시스템이나 서비스가 &lt;b&gt;사용자가 누구인지 확인하는 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI에서의 인증 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 기반: Depends와 같은 의존성 주입을 통해 쉽게 구현 가능, 쿠키 기반의 세션 관리를 사용&lt;/li&gt;
&lt;li&gt;토큰 기반: Bearer토큰(와)과 같은 인증 스키마를 사용해 JWT 기반 인증을 구현 일반적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. JWT이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JWT&lt;/b&gt;는 주로 인증 목적으로 사용되며,&amp;nbsp;&lt;b&gt;토큰 안에 사용자의 인증 정보를 포함&lt;/b&gt;하고 있어 서버가 별도로 상태를 유지할 필요가 없습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JWT의 구조&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Header(헤더): 토큰의 타입(JWT)과 서명 생성에 사용된 암호화 알고리즘(예: HS256) 정보가 담깁니다.&lt;/li&gt;
&lt;li&gt;Payload(페이로드): 토큰에 담을 실제 정보(사용자 식별 ID, 권한, 토큰 만료 시간 등)가 Key-Value 형태의 '클레임(Claim)'으로 포함됩니다.&lt;/li&gt;
&lt;li&gt;Signature(서명): 헤더와 페이로드를 서버가 가지고 있는 비밀키(Secret Key)로 암호화한 값입니다. 이를 통해 토큰의 위변조 여부를 검증합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JWT 인증 동작 방식&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자가 아이디와 비밀번호로 로그인을 요청합니다.&lt;/li&gt;
&lt;li&gt;서버는 검증 후 , 사용자 정보와 비밀키를 이용해 JWT 토큰을 발급하여 클라이언트에게 전달합니다.&lt;/li&gt;
&lt;li&gt;클라이언트는 이 토큰을 저장하고, 서버에 요청을 보낼 때마다 HTTP 헤더(Authorization)에 토큰을 포함시켜 보냅니다.&lt;/li&gt;
&lt;li&gt;서버는 토큰의 서명(Signature)을 복호화하고 검증하여 변조되지 않았는지, 만료되지는 않았는 지 확인 후 요청을 처리합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JWT의 장단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;무상태성&lt;/b&gt;: 서버가 세션 상태를 기억할 필요 없이 토큰 하나로 사용자를 인증하므로 서버 확정성이 뛰어납니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자체 포함&lt;/b&gt;: 토큰 안에 필요한 모든 정보가 들어있어 데이터베이스 조회를 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;토큰 무효화의 어려움&lt;/b&gt;: 한 번 발급된 토큰은 서버에서 강제로 만료시킬 수 없어 보안상 위험(토큰 탈취 등)이 있을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 크기&lt;/b&gt;: 페이로드에 많은 정보를 담을수록 토큰의 길이가 길어져 네트워크 트래픽에 영향을 줄 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. FastAPI에서 JWT 사용법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT 인증을 구현하기 위해서는 크게 &lt;b&gt;5단계&lt;/b&gt;를 거친다.&lt;/p&gt;
&lt;h4 data-end=&quot;216&quot; data-start=&quot;191&quot; data-section-id=&quot;d2us31&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;① 필요한 라이브러리 설치 및 불러오기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;245&quot; data-start=&quot;218&quot; data-ke-size=&quot;size16&quot;&gt;JWT 인증을 위해 필요한 라이브러리를 설치한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install pyjwt bcrypt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import jwt
import bcrypt
from fastapi.security import OAuth2PasswordBearer
from datetime import datetime, timedelta, timezone&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;429&quot; data-start=&quot;426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;448&quot; data-start=&quot;431&quot; data-section-id=&quot;pt957j&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;② 비밀키와 JWT 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;488&quot; data-start=&quot;450&quot; data-ke-size=&quot;size16&quot;&gt;JWT를 생성하고 검증하기 위해 서버만 알고 있는 비밀키를 설정한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;SECRET_KEY = &quot;super-secret-key-change-this-in-production&quot;
ALGORITHM = &quot;HS256&quot;
ACCESS_TOKEN_EXPIRE_MINUTES = 30&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;731&quot; data-start=&quot;616&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;655&quot; data-start=&quot;616&quot; data-section-id=&quot;90dajf&quot;&gt;&lt;b&gt;SECRET_KEY&lt;/b&gt; : 토큰 생성 및 검증에 사용하는 비밀키&lt;/li&gt;
&lt;li data-end=&quot;686&quot; data-start=&quot;656&quot; data-section-id=&quot;7ur384&quot;&gt;&lt;b&gt;ALGORITHM&lt;/b&gt; : JWT 암호화 알고리즘&lt;/li&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;687&quot; data-section-id=&quot;uexr98&quot;&gt;&lt;b&gt;ACCESS_TOKEN_EXPIRE_MINUTES&lt;/b&gt; : 토큰 유효 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;793&quot; data-start=&quot;733&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;793&quot; data-start=&quot;735&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스에서는 SECRET_KEY를 코드에 직접 작성하지 않고 .env 파일에 저장하여 사용한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;798&quot; data-start=&quot;795&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;829&quot; data-start=&quot;800&quot; data-section-id=&quot;1yzl8ch&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;③ OAuth2PasswordBearer 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;887&quot; data-start=&quot;831&quot; data-ke-size=&quot;size16&quot;&gt;FastAPI는 JWT를 쉽게 사용할 수 있도록 OAuth2PasswordBearer를 제공한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;oauth2_scheme = OAuth2PasswordBearer(tokenUrl=&quot;login&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;962&quot; data-start=&quot;959&quot; data-ke-size=&quot;size16&quot;&gt;여기서&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;tokenUrl=&quot;login&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1020&quot; data-start=&quot;996&quot; data-ke-size=&quot;size16&quot;&gt;은 토큰을 발급받는 로그인 주소를 의미한다.&lt;/p&gt;
&lt;p data-end=&quot;1037&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size16&quot;&gt;JWT가 필요한 API에서는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;token: str = Depends(oauth2_scheme)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1101&quot; data-start=&quot;1090&quot; data-ke-size=&quot;size16&quot;&gt;만 작성하면 자동으로&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Authorization: Bearer JWT토큰&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1154&quot; data-start=&quot;1140&quot; data-ke-size=&quot;size16&quot;&gt;헤더에서 토큰을 읽어온다.&lt;/p&gt;
&lt;hr data-end=&quot;1159&quot; data-start=&quot;1156&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1176&quot; data-start=&quot;1161&quot; data-section-id=&quot;86ipww&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;④ JWT 토큰 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1211&quot; data-start=&quot;1178&quot; data-ke-size=&quot;size16&quot;&gt;로그인 성공 시 JWT 토큰을 생성하여 사용자에게 반환한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;def create_access_token(data: dict,
                        expires_delta: Optional[timedelta] = None):

    to_encode = data.copy()

    expire = datetime.now(timezone.utc) + (
        expires_delta or timedelta(minutes=15)
    )

    to_encode.update({&quot;exp&quot;: expire})

    return jwt.encode(
        to_encode,
        SECRET_KEY,
        algorithm=ALGORITHM
    )&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1615&quot; data-start=&quot;1595&quot; data-ke-size=&quot;size16&quot;&gt;토큰에는 보통 다음 정보를 저장한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;sub&quot;: username,
    &quot;exp&quot;: 만료시간
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1715&quot; data-start=&quot;1673&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1694&quot; data-start=&quot;1673&quot; data-section-id=&quot;1camyrf&quot;&gt;&lt;b&gt;sub&lt;/b&gt; : 사용자 식별 정보&lt;/li&gt;
&lt;li data-end=&quot;1715&quot; data-start=&quot;1695&quot; data-section-id=&quot;ze1wk7&quot;&gt;&lt;b&gt;exp&lt;/b&gt; : 토큰 만료 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1725&quot; data-start=&quot;1717&quot; data-ke-size=&quot;size16&quot;&gt;로그인 성공 시&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;access_token = create_access_token(
    data={&quot;sub&quot;: user[&quot;username&quot;]},
    expires_delta=timedelta(minutes=30)
)

return {
    &quot;access_token&quot;: access_token,
    &quot;token_type&quot;: &quot;bearer&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1946&quot; data-start=&quot;1929&quot; data-ke-size=&quot;size16&quot;&gt;형태로 클라이언트에게 전달한다.&lt;/p&gt;
&lt;hr data-end=&quot;1951&quot; data-start=&quot;1948&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;1968&quot; data-start=&quot;1953&quot; data-section-id=&quot;3cy82u&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;⑤ JWT 토큰 검증&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2000&quot; data-start=&quot;1970&quot; data-ke-size=&quot;size16&quot;&gt;JWT가 필요한 API에서는 전달받은 토큰을 검증한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;payload = jwt.decode(
    token,
    SECRET_KEY,
    algorithms=[ALGORITHM]
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2112&quot; data-start=&quot;2095&quot; data-ke-size=&quot;size16&quot;&gt;토큰에서 사용자 정보를 꺼낸다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;username = payload.get(&quot;sub&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2162&quot; data-start=&quot;2159&quot; data-ke-size=&quot;size16&quot;&gt;토큰이&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2192&quot; data-start=&quot;2164&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2172&quot; data-start=&quot;2164&quot; data-section-id=&quot;icdc0w&quot;&gt;변조되었거나&lt;/li&gt;
&lt;li data-end=&quot;2181&quot; data-start=&quot;2173&quot; data-section-id=&quot;hw0iz4&quot;&gt;만료되었거나&lt;/li&gt;
&lt;li data-end=&quot;2192&quot; data-start=&quot;2182&quot; data-section-id=&quot;11sta86&quot;&gt;올바르지 않으면&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2204&quot; data-start=&quot;2194&quot; data-ke-size=&quot;size16&quot;&gt;예외를 발생시킨다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;except jwt.PyJWTError:
    raise HTTPException(
        status_code=401,
        detail=&quot;Could not validate credentials&quot;
    )&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2384&quot; data-start=&quot;2348&quot; data-ke-size=&quot;size16&quot;&gt;이후 DB에서 사용자를 조회하여 실제 존재하는 계정인지 확인한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT username
FROM users
WHERE username = ?&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2460&quot; data-start=&quot;2447&quot; data-ke-size=&quot;size16&quot;&gt;존재하면 인증 성공이다.&lt;/p&gt;
&lt;hr data-end=&quot;2465&quot; data-start=&quot;2462&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2482&quot; data-start=&quot;2467&quot; data-section-id=&quot;4t0km2&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. JWT 인증 과정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2504&quot; data-start=&quot;2484&quot; data-ke-size=&quot;size16&quot;&gt;JWT 인증은 다음 순서로 동작한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;① 회원가입
        │
        ▼
DB에 사용자 저장
        │
        ▼
② 로그인
(ID / Password)
        │
        ▼
비밀번호 검증
        │
        ▼
JWT 생성
        │
        ▼
클라이언트에게 전달
        │
        ▼
클라이언트가 토큰 저장
(LocalStorage, SessionStorage 등)
        │
        ▼
API 요청
Authorization: Bearer JWT
        │
        ▼
FastAPI가 JWT 검증
        │
        ▼
사용자 정보 확인
        │
        ▼
API 실행&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2900&quot; data-start=&quot;2897&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2917&quot; data-start=&quot;2902&quot; data-section-id=&quot;11lzy9b&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 주요 JWT 함수&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;함수설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3152&quot; data-start=&quot;2919&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3152&quot; data-start=&quot;2947&quot;&gt;
&lt;tr data-end=&quot;2974&quot; data-start=&quot;2947&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2964&quot; data-start=&quot;2947&quot;&gt;jwt.encode()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2974&quot; data-start=&quot;2964&quot;&gt;JWT 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3011&quot; data-start=&quot;2975&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2992&quot; data-start=&quot;2975&quot;&gt;jwt.decode()&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3011&quot; data-start=&quot;2992&quot;&gt;JWT 검증 및 데이터 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3074&quot; data-start=&quot;3012&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3039&quot; data-start=&quot;3012&quot;&gt;OAuth2PasswordBearer()&lt;/td&gt;
&lt;td data-end=&quot;3074&quot; data-start=&quot;3039&quot; data-col-size=&quot;sm&quot;&gt;Authorization 헤더에서 Bearer 토큰 추출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3112&quot; data-start=&quot;3075&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3089&quot; data-start=&quot;3075&quot;&gt;Depends()&lt;/td&gt;
&lt;td data-end=&quot;3112&quot; data-start=&quot;3089&quot; data-col-size=&quot;sm&quot;&gt;JWT 인증을 필요한 API에 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3152&quot; data-start=&quot;3113&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3139&quot; data-start=&quot;3113&quot;&gt;create_access_token()&lt;/td&gt;
&lt;td data-end=&quot;3152&quot; data-start=&quot;3139&quot; data-col-size=&quot;sm&quot;&gt;JWT 생성 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3157&quot; data-start=&quot;3154&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3179&quot; data-start=&quot;3159&quot; data-section-id=&quot;10ipi64&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. JWT와 세션 로그인 비교&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;구분세션 로그인JWT 로그인
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3434&quot; data-start=&quot;3181&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3434&quot; data-start=&quot;3243&quot;&gt;
&lt;tr data-end=&quot;3284&quot; data-start=&quot;3243&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3254&quot; data-start=&quot;3243&quot;&gt;인증 정보 저장&lt;/td&gt;
&lt;td data-end=&quot;3268&quot; data-start=&quot;3254&quot; data-col-size=&quot;sm&quot;&gt;서버(Session)&lt;/td&gt;
&lt;td data-end=&quot;3284&quot; data-start=&quot;3268&quot; data-col-size=&quot;sm&quot;&gt;클라이언트(Token)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3317&quot; data-start=&quot;3285&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3293&quot; data-start=&quot;3285&quot;&gt;서버 상태&lt;/td&gt;
&lt;td data-end=&quot;3304&quot; data-start=&quot;3293&quot; data-col-size=&quot;sm&quot;&gt;Stateful&lt;/td&gt;
&lt;td data-end=&quot;3317&quot; data-start=&quot;3304&quot; data-col-size=&quot;sm&quot;&gt;Stateless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3346&quot; data-start=&quot;3318&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3327&quot; data-start=&quot;3318&quot;&gt;서버 메모리&lt;/td&gt;
&lt;td data-end=&quot;3332&quot; data-start=&quot;3327&quot; data-col-size=&quot;sm&quot;&gt;사용&lt;/td&gt;
&lt;td data-end=&quot;3346&quot; data-start=&quot;3332&quot; data-col-size=&quot;sm&quot;&gt;거의 사용하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3364&quot; data-start=&quot;3347&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3353&quot; data-start=&quot;3347&quot;&gt;확장성&lt;/td&gt;
&lt;td data-end=&quot;3358&quot; data-start=&quot;3353&quot; data-col-size=&quot;sm&quot;&gt;낮음&lt;/td&gt;
&lt;td data-end=&quot;3364&quot; data-start=&quot;3358&quot; data-col-size=&quot;sm&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3398&quot; data-start=&quot;3365&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3372&quot; data-start=&quot;3365&quot;&gt;로그아웃&lt;/td&gt;
&lt;td data-end=&quot;3377&quot; data-start=&quot;3372&quot; data-col-size=&quot;sm&quot;&gt;쉬움&lt;/td&gt;
&lt;td data-end=&quot;3398&quot; data-start=&quot;3377&quot; data-col-size=&quot;sm&quot;&gt;토큰 만료 전까지 무효화 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3434&quot; data-start=&quot;3399&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3407&quot; data-start=&quot;3399&quot;&gt;사용 예시&lt;/td&gt;
&lt;td data-end=&quot;3415&quot; data-start=&quot;3407&quot; data-col-size=&quot;sm&quot;&gt;웹 사이트&lt;/td&gt;
&lt;td data-end=&quot;3434&quot; data-start=&quot;3415&quot; data-col-size=&quot;sm&quot;&gt;REST API, 모바일 앱&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/62</guid>
      <comments>https://cd-record.tistory.com/62#entry62comment</comments>
      <pubDate>Thu, 11 Jun 2026 18:00:49 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.10) Fast API</title>
      <link>https://cd-record.tistory.com/60</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;FastAPI&lt;/b&gt;&lt;/i&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# FastAPI란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;FastAPI&lt;/b&gt;는 파이썬으로 웹 서버(API)를 만들기 위한 현대적이고 매우 빠른 프레임워크입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;왜 쓰는가?&lt;/b&gt;: 코드가 직관적이고, 실행 속도가 매우 빠르며, 비동기(Async) 처리가 쉬워서 현대적인 웹 서비스 구축에 적합합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;핵심 개념&lt;/b&gt;: @app.get이나 @app.post처럼 데코레이터(@)를 사용해 &quot;이 주소(URL)로 접속하면 이 함수를 실행해라&quot;라고 지정하는 방식입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* Flask vs FastAPI&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;4&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Flask&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;FastAPI&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0,0&quot;&gt;속도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,1,1,0&quot;&gt;상대적으로 느림 (동기 방식)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,2,0&quot;&gt;매우 빠름&lt;/b&gt; (Node.js/Go와 비견됨)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0,0&quot;&gt;비동기 처리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,2,1,0&quot;&gt;지원이 제한적임&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,2,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,2,0&quot;&gt;완벽하게 지원 (Async/Await)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,0,0&quot;&gt;데이터 검증&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,3,1,0&quot;&gt;직접 구현하거나 외부 라이브러리 필요&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,3,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,2,0&quot;&gt;Pydantic을 통한 자동 검증&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,4,0,0&quot;&gt;문서화&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,4,1,0&quot;&gt;직접 만들어야 함&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,4,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,4,2,0&quot;&gt;Swagger API 문서 자동 생성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,5,0,0&quot;&gt;학습 난이도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,5,1,0&quot;&gt;아주 쉬움&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;4,5,2,0&quot;&gt;중간 정도 (비동기 개념 필요)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# Uvicorn&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python으로 작성된 &lt;b&gt;초고속 비동기 ASGI(Asynchronous Server Gateway Interface) 웹 서버&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;  Uvicorn의 핵심 역할&lt;/b&gt;&lt;/h4&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-ved=&quot;2ahUKEwjekdmdpPyUAxXVk1YBHWw2KQYQi4wTegoIAggACAAIAhAK&quot; data-bfc=&quot;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAIQCw&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;웹 서버와 애플리케이션 연결:&lt;/b&gt; 외부(사용자)로부터 들어오는 HTTP 요청을 받아 애플리케이션에 전달하고, 애플리케이션의 응답을 다시 사용자에게 돌려주는 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAIQDg&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;비동기(Async/Await) 지원:&lt;/b&gt; 파이썬의 asyncio를 기반으로 설계되어 빠르고 효율적인 비동기 처리가 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAIQEw&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;초고속 성능:&lt;/b&gt; uvloop 및 httptools와 같은 라이브러리를 사용하여 Node.js나 Go와 견줄 만큼 빠른 속도를 자랑합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px 0px 12px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-hveid=&quot;CAIIAAgACAIQGA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;웹소켓(WebSocket) 기본 지원:&lt;/b&gt; HTTP 요청뿐만 아니라 실시간 양방향 통신인 WebSocket을 기본적으로 지원합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;## FastAPI랑 Uvicorn 관계&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,0,0&quot;&gt;FastAPI (웹 프레임워크):&lt;/b&gt; 누가 어떤 주소로 들어왔을 때, 어떤 함수를 실행할지 결정하는 '두뇌'입니다. 하지만 이 두뇌는 스스로 외부와 통신하는 능력이 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3,1,0&quot;&gt;Uvicorn (서버/통신사):&lt;/b&gt; 외부 브라우저(크롬 등)로부터 오는 복잡한 신호를 받아서, FastAPI라는 두뇌가 이해할 수 있는 형식으로 전달해 주는 '심장'이자 '통신사'입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;b&gt;# EX) PYTHON01&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 1. 라이브러리 임포트 및 앱 생성&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781082485364&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import FastAPI
from pydantic import BaseModel, Field
from fastapi.responses import HTMLResponse, PlainTextResponse, JSONResponse
import uvicorn

app = FastAPI()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;FastAPI&lt;/b&gt;: 웹 서버 기능을 제공하는 핵심 클래스입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;BaseModel&lt;/b&gt;: 데이터의 구조를 정의하고 검증하기 위한 Pydantic의 도구입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;responses&lt;/b&gt;: JSON 외에 HTML이나 일반 텍스트 등 다양한 형식의 응답을 반환할 때 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 2. Pydantic 모델 정의 (데이터 틀 만들기)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781082496180&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class UserItem(BaseModel):
    name: str
    age: int  # 나이는 반드시 정수여야 함

class Item(BaseModel):
    name: str = Field(examples=[&quot;맥북 프로&quot;]) # 예시 값 지정
    price: float&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;BaseModel&lt;/b&gt;: 이 클래스를 상속받으면, 들어오는 데이터가 name은 문자열(str), age는 정수(int)인지 &lt;b data-index-in-node=&quot;66&quot; data-path-to-node=&quot;8,0,0&quot;&gt;자동으로 확인&lt;/b&gt;합니다. 틀린 타입이 들어오면 서버가 알아서 에러 메시지를 보내줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;Field(examples=[...])&lt;/b&gt;: API 문서(Swagger)를 볼 때 사용자에게 &quot;이런 값을 넣으세요&quot;라고 예시를 보여주는 친절한 기능입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. API 엔드포인트 분석&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[상품 생성 API]&lt;/p&gt;
&lt;pre id=&quot;code_1781082589336&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.post(&quot;/items&quot;, response_model=Item)
def create_item(item: Item):
    &quot;&quot;&quot;
    ## 상품을 생성합니다
    이 API는 ...
    &quot;&quot;&quot;
    return item&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;response_model=Item&lt;/b&gt;: 이 API가 돌려주는 데이터도 Item 모델을 따르도록 강제합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;Docstring (&quot;&quot;&quot;...&quot;&quot;&quot;)&lt;/b&gt;: 함수 안에 쓴 주석은 나중에 자동으로 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;13,1,0&quot;&gt;API 문서(Swagger)의 상세 설명&lt;/b&gt;으로 변환됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size18&quot;&gt;[기본 응답 및 사용자 생성]&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjdxtmhofyUAxUAAAAAHQAAAAAQ3wE&quot; data-hveid=&quot;0&quot;&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;@app.get(&quot;/&quot;)
def read_root():
    return {&quot;Hello&quot;: &quot;World&quot;}

@app.post(&quot;/users&quot;)
def create_user(user: UserItem):
    return {&quot;message&quot;: f&quot;{user.name}님 환영합니다.&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;create_user&lt;/b&gt;: UserItem 모델을 사용하여 클라이언트가 보낸 데이터가 올바른지 검증하고, 정상일 경우 user.name을 이용해 환영 메시지를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 다양한 응답 형식 반환&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size18&quot;&gt;FastAPI는 기본적으로 JSON을 반환하지만, 특정 형식으로 강제할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1781082960708&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 텍스트 반환
@app.get(&quot;/text&quot;, response_class=PlainTextResponse)
def get_text():
    return &quot;Hello World&quot;

# 2. HTML 반환
@app.get(&quot;/html&quot;, response_class=HTMLResponse)
def get_html():
    return &quot;&amp;lt;h1&amp;gt;안녕하세요&amp;lt;/h1&amp;gt;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; response_class&lt;/b&gt;: 서버가 응답을 보낼 때 브라우저에게 &quot;이건 JSON이야&quot;, &quot;이건 HTML이야&quot;라고 알려주는 역할을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 5. 서버 실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781083111022&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if __name__ == &quot;__main__&quot;:
    uvicorn.run(&quot;S001:app&quot;, host=&quot;127.0.0.1&quot;, port=8000, reload=True)
    # 콘솔과 동일: uvicorn main:app --host 127.0.0.1 --port 8000 --reload&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,0,0&quot;&gt;uvicorn.run&lt;/b&gt;: FastAPI 애플리케이션(app)을 실행하는 서버 엔진입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,1,0&quot;&gt;reload=True&lt;/b&gt;: 코드를 수정하고 저장하면 서버를 껐다 켜지 않아도 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;25,1,0&quot;&gt;자동으로 반영&lt;/b&gt;해주는 개발용 핵심 옵션입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;b&gt;# EX) PYTHON02&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 1. 필수 라이브러리 및 설정&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781083507091&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles

app = FastAPI()

# 템플릿(HTML)이 있는 폴더 지정
templates = Jinja2Templates(directory=&quot;0610/templates&quot;)

# 정적 파일(CSS, JS, 이미지)이 있는 폴더 마운트
app.mount(&quot;/static&quot;, StaticFiles(directory=&quot;0610/static&quot;), name=&quot;static&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;Jinja2Templates&lt;/b&gt;: HTML 파일 안에 파이썬 변수를 쏙 집어넣어 동적인 웹 페이지를 만드는 도구입니다. (예: {{ title }})&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;app.mount(&quot;/static&quot;, ...)&lt;/b&gt;: 브라우저가 CSS나 JS 파일을 요청할 때, 서버 내부의 0610/static 폴더에서 파일을 찾아 건네주겠다는 약속입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 2. 메인 페이지 라우팅&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781083659034&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.get(&quot;/&quot;)
async def read_root(request: Request):
    context = {&quot;title&quot;: &quot;FastAPI 템플릿 예제&quot;, &quot;message&quot;: &quot;Hello World&quot;}
    return templates.TemplateResponse(        
        request=request,
        name=&quot;index.html&quot;,
        context=context
    )&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;request: Request&lt;/b&gt;: FastAPI가 현재 접속한 사용자의 정보(IP, 헤더 등)를 담아 자동으로 전달해주는 객체입니다. 템플릿을 렌더링할 때 반드시 필요합니다. (HTML 페이지를 보여줄 때만 필요)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;async (비동기)&lt;/b&gt;: 이 함수가 실행되는 동안 서버가 멈추지 않고 다른 요청도 동시에 처리할 수 있게 합니다. 데이터베이스 조회나 파일 읽기처럼 시간이 걸리는 작업을 할 때 매우 중요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;request=request&lt;/b&gt;: 이 템플릿을 요청한 사용자가 누구인지, 어떤 환경(브라우저 언어, 쿠키 등)인지 파악해서 보내기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;name = &quot;index.html&quot;&lt;/b&gt;: 어떤 HTML 파일을 가져올 지 보내기&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;context&lt;/b&gt;: HTML 파일로 보낼 파이썬 데이터입니다. index.html 안에서 {{ title }}이라고 쓰면 &quot;FastAPI 템플릿 예제&quot;라는 글자가 나타나게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Q. 왜 async를 붙이나요?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;FastAPI는 &lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;11&quot;&gt;비동기 프레임워크&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보통 웹 서버는 한 번에 한 명의 요청만 처리하면 느려지는데, async를 사용하면 &quot;데이터를 DB에서 가져오는 동안(기다리는 시간)&quot; 다른 사용자의 접속을 먼저 처리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;따라서, &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;12,1,0&quot;&gt;성능을 극대화하려면 DB 작업이 포함된 함수에는 async를 붙이는 것이 권장&lt;/b&gt;됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# EX) PYTHON03&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 주요 라이브러리 및 변수&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjdxtmhofyUAxUAAAAAHQAAAAAQ6wI&quot; data-hveid=&quot;0&quot;&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI
import asyncio
import uvicorn
from fastapi.responses import PlainTextResponse

app = FastAPI()

total = ''&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;asyncio&lt;/b&gt;: 파이썬에서 비동기 프로그래밍을 할 때 사용하는 표준 라이브러리입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;total&lt;/b&gt;: 여러 비동기 함수들이 결과를 합치는 공용 변수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 2. 비동기 함수 (Async Tasks)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1781085592733&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async def async_func():
    await asyncio.sleep(2) # 2초 동안 '대기' (다른 일 할 수 있음)
    global total
    total += &quot;Async World1 &quot;

async def async_func2():
    await asyncio.sleep(1) # 1초 동안 '대기'
    global total
    total += &quot;Async World2 &quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;async def&lt;/b&gt;: 이 함수는 비동기 함수(코루틴)임을 선언합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;await asyncio.sleep(n)&lt;/b&gt;: &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;7,1,0&quot;&gt;가장 중요한 부분입니다.&lt;/b&gt; 여기서 &quot;n초간 쉬어라&quot;라고 명령하는데, 이때 &quot;나는 쉬는 동안 CPU는 다른 일을 해!&quot;라고 컴퓨터에게 제어권을 넘겨줍니다.&lt;/li&gt;
&lt;li&gt;덕분에 async_func가 2초를 쉬는 동안 CPU는 1초 쉬는 async_func2를 먼저 처리할 수 있게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 메인 API 엔드포인트 (read_root)&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjdxtmhofyUAxUAAAAAHQAAAAAQ7QI&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1781085894963&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.get(&quot;/&quot;, response_class=PlainTextResponse)
async def read_root():
    global total
    total = &quot;&quot;

    # 작업을 생성하고 동시에 실행 시작
    task1 = asyncio.create_task(async_func())
    task2 = asyncio.create_task(async_func2())

    # 모든 작업이 끝날 때까지 기다림
    await task1
    await task2

    return total&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;asyncio.create_task(...)&lt;/b&gt;: 이 명령은 함수를 바로 실행하지 않고, &quot;이 작업을 백그라운드에서 실행해 놔!&quot;라고 예약하는 것과 같습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;동시 처리의 마법&lt;/b&gt;: task1을 만들자마자 바로 task2도 만들어버립니다. 즉, task1이 2초를 쉬는 동안 task2가 1초를 쉬고 먼저 완료되는 구조가 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;await task1, await task2&lt;/b&gt;: 예약해 둔 작업들이 끝날 때까지 기다렸다가 다음 단계로 넘어갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# EX) PYTHON04&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 외부 데이터 호출의 핵심 httpx&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjdxtmhofyUAxUAAAAAHQAAAAAQtQM&quot; data-hveid=&quot;0&quot;&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;import httpx

# ...

async with httpx.AsyncClient() as client:
    response = await client.get(url)
    weather_data = response.json()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;httpx&lt;/b&gt;: 파이썬에서 다른 서버(여기서는 Open-Meteo)로 데이터를 요청할 때 사용하는 라이브러리입니다. requests와 비슷하지만, &lt;b data-index-in-node=&quot;80&quot; data-path-to-node=&quot;4,0,0&quot;&gt;비동기(Async)를 지원&lt;/b&gt;하기 때문에 FastAPI와 궁합이 매우 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;AsyncClient()&lt;/b&gt;: 비동기 방식으로 데이터를 받아옵니다. await를 사용하여 데이터가 올 때까지 서버가 멈추지 않게 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 데이터 가공 (데이터 정제)&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjdxtmhofyUAxUAAAAAHQAAAAAQtgM&quot; data-hveid=&quot;0&quot;&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;times = weather_data[&quot;hourly&quot;][&quot;time&quot;]
temperatures = weather_data[&quot;hourly&quot;][&quot;temperature_2m&quot;]
hourly_forecast = list(zip(times, temperatures))
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;zip(times, temperatures)&lt;/b&gt;: 이것은 아주 효율적인 기법입니다. 시간 리스트와 기온 리스트가 따로 놀고 있을 때, 이 둘을 순서대로 하나씩 짝을 지어 (시간, 온도) 형태의 &lt;b data-index-in-node=&quot;106&quot; data-path-to-node=&quot;8,0,0&quot;&gt;튜플 리스트&lt;/b&gt;로 만들어 줍니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML에서 반복문을 돌릴 때 아주 편리한 구조가 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 화면 전달 및 제한&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjdxtmhofyUAxUAAAAAHQAAAAAQtwM&quot; data-hveid=&quot;0&quot;&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;context = {
    &quot;title&quot;: &quot;서울 시간별 기온 예보&quot;,
    &quot;forecast&quot;: hourly_forecast[:24]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;hourly_forecast[:24]&lt;/b&gt;: 데이터가 너무 많으면 사용자가 읽기 힘듭니다. 파이썬의 &lt;b data-index-in-node=&quot;53&quot; data-path-to-node=&quot;12,0,0&quot;&gt;슬라이싱([:24])&lt;/b&gt; 기능을 사용해 딱 필요한 24시간치만 잘라서 깔끔하게 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bvnQyh/dJMcabRZ8Vy/5SlKL7vlhwsgWWTHdzkj21/001.ipynb?attach=1&amp;amp;knm=tfile.ipynb&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;001.ipynb&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/60</guid>
      <comments>https://cd-record.tistory.com/60#entry60comment</comments>
      <pubDate>Wed, 10 Jun 2026 19:29:14 +0900</pubDate>
    </item>
    <item>
      <title>[스나이퍼팩토리] 한컴AI아카데미(26.06.09) 네이버메일보내기자동화(Selenium)</title>
      <link>https://cd-record.tistory.com/59</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;!-- buildify365 TOC --&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;div id=&quot;auto-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/gh/buildify365/auto-toc@v1/auto-toc.min.js&quot;&gt;&lt;/script&gt;
&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;b&gt;Selenium &amp;amp; PyAutoGUI를 활용한 네이버 메일 자동화&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;/i&gt;목적: 네이버 로그인부터 메일 작성, 내용 입력 및 전송까지의 과정을 자동화. 특히 단순 자동화를 넘어 pyperclip을 이용해 클립보드에 텍스트를 복사한 뒤 Ctrl+V를 수행함으로써, 한글 입력 시 발생할 수 있는 브라우저 매크로 오류를 우회하는 전략을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 주요 기능 및 라이브러리 역할&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1781018323777&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By
import time

import pyautogui
import pyperclip

# Selenium (webdriver): 웹 브라우저를 제어하여 요소 탐색 및 클릭 수행.
# PyAutoGUI: 브라우저 내 입력을 제어하며, 사용자로부터 팝업창을 통해 정보를 입력받음.
# Pyperclip: 한글 등 다국어 텍스트 입력 시 발생할 수 있는 전송 오류를 방지하기 위해 클립보드 복사/붙여넣기 방식을 활용.
# WebDriver Manager: 크롬 드라이버를 수동으로 다운로드할 필요 없이 자동으로 설치 및 업데이트 관리.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;## PyAutoGUI, Pyperclip&lt;/b&gt;을 쓰는 기술적 이유&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;한글 입력 이슈 해결&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;자음/모음 분리:&lt;/b&gt; 안녕하세요가 ㅇㅏㄴㄴㅕㅇㅎㅏㅅㅔㅇㅛ처럼 분리되어 입력되는 현상.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;글자 누락:&lt;/b&gt; 서버 응답 속도가 느릴 경우 중간 글자가 씹히는 현상.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;인코딩 오류:&lt;/b&gt; 브라우저와 Selenium 드라이버 간의 통신 과정에서 한글이 깨지는 현상.&lt;/li&gt;
&lt;/ul&gt;
&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;해결책:&lt;/b&gt; pyperclip으로 클립보드에 완성된 문자열을 저장하고, pyautogui로 Ctrl+V를 입력하면 &lt;b data-index-in-node=&quot;62&quot; data-path-to-node=&quot;7&quot;&gt;OS 레벨에서 복사된 데이터를 한 번에 붙여넣기 때문에&lt;/b&gt; 글자 깨짐이나 누락이 발생하지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력 속도 최적화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;send_keys()는 글자를 한 글자씩 브라우저로 전송합니다. 본문 내용이 아주 긴 경우, 모든 글자를 전송하는 데 시간이 상당히 걸립니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;send_keys():&lt;/b&gt; &quot;안녕하세요... (긴 글)&quot; &amp;rarr; 전송까지 초 단위 소요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;Ctrl + V:&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 클립보드의 데이터를 즉시 브라우저로 전달 &amp;rarr; &lt;/span&gt;&lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;10,1,0&quot;&gt;즉시 입력&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브라우저의 보안 정책 우회&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일부 웹사이트는 자동화 툴(Selenium)이 입력하는 send_keys()를 감지하여 봇(Bot)으로 차단하는 경우가 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pyautogui를 사용하여 Ctrl+V를 수행하는 것은 실제 사용자가 키보드를 누르는 행위와 매우 유사하게 동작합니다. 따라서 자동화 감지 로직을 비교적 안전하게 우회할 수 있는 '사람 같은' 입력 방식이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 사용자 정보 입력 (PyAutoGUI 활용)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1781018749952&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uid = pyautogui.prompt(&quot;네이버 ID: &quot;, default=&quot;l1234&quot;)
pwd = pyautogui.password(&quot;비밀번호: &quot;)
toname = pyautogui.prompt(&quot;받는사람 이름: &quot;, default=&quot;홍길동&quot;)
tomail = pyautogui.prompt(&quot;받는사람 메일: &quot;, default=&quot;12345@gmail.com&quot;)
response = pyautogui.confirm(
    '어떤 내용을 하시겠습니까?',
    buttons=['가입안내', '합격안내', '계약서']
)

if response==&quot;가입안내&quot;:
    to_subject = &quot;[테스트] 가입안내입니다.&quot;
    to_content = f&quot;{toname}님 가입을 환영합니다.\n\n최고의 서비스로 최선을 다하겠습니다.\n\n감사합니다.&quot;
elif  response==&quot;합격안내&quot;:
    to_subject = &quot;[테스트] 합격결과입니다.&quot;
    to_content = f'''{toname}님 이번 면접에 최종 합격 하였습니다.\n
저희 가족이 되심을 축하합니다.
입사일은 2026년 10월 1일입니다.\n
감사합니다.'''
elif  response==&quot;계약서&quot;:    
    to_subject = &quot;[테스트] 점심 계약서.&quot;
    to_content = f'''{toname}님 최종 계약서 내용입니다.\n
귀하는 2024년 12월 4일 ~ 2025년 4월 24일까지 점심을 사기로 하였습니다.\n
# 계약자 A: {toname}
# 계약자 B: 이순신'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pyautogui의 prompt와 password 함수를 사용하여 스크립트 실행 시 사용자로부터 ID, 비밀번호, 받는 사람 정보를 실시간으로 입력받습니다. 또한 confirm 함수를 통해 선택된 항목에 따라 메일 본문(to_content)과 제목(to_subject)을 조건문(if-elif)으로 동적 생성합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* 코드를 main()함수로 묶은 이유?&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;2&quot;&gt;1. 모듈화 및 재사용성 (Import 방지)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;2&quot;&gt;파이썬에서는 다른 파일에서 이 코드를 import 할 때, 함수 밖의 코드들은 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;3&quot;&gt;import 되는 순간 즉시 실행&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-path-to-node=&quot;2&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;함수로 묶지 않았을 때:&lt;/b&gt; 다른 파일에서 이 코드를 가져오기만 해도 메일 자동화 프로그램이 강제로 실행되어 버립니다.&lt;/li&gt;
&lt;li data-path-to-node=&quot;2&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;함수로 묶었을 때:&lt;/b&gt; main() 함수 안에 로직을 넣어두면, 다른 파일에서 import 해도 함수를 직접 호출(main())하기 전까지는 코드가 실행되지 않습니다. 즉, &lt;b data-index-in-node=&quot;95&quot; data-path-to-node=&quot;4,1,0&quot;&gt;필요할 때만 호출할 수 있는 도구&lt;/b&gt;로 만드는 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;5&quot;&gt;2. 코드의 구조적 깔끔함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;5&quot;&gt;프로그램이 커지면 여러 개의 함수가 생기게 됩니다. main()은 프로그램의 &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;6&quot;&gt;&quot;시작점(Entry Point)&quot;&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 역할을 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-path-to-node=&quot;5&quot;&gt;코드를 읽는 사람(또는 미래의 본인)이 어디서부터 프로그램이 시작되는지 직관적으로 알 수 있습니다.&lt;/li&gt;
&lt;li data-path-to-node=&quot;5&quot;&gt;스크립트의 흐름(입력 -&amp;gt; 설정 -&amp;gt; 실행 -&amp;gt; 종료)을 한눈에 파악하기 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;3. if __name__ == &quot;__main__&quot;:의 마법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;이 구문은 &quot;이 파일을 직접 실행했을 때만 아래 코드를 실행하라&quot;는 뜻입니다.&lt;/li&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;직접 실행할 때:&lt;/b&gt; __name__ 변수는 &quot;__main__&quot;이라는 값을 가집니다. 따라서 main()이 실행됩니다.&lt;/li&gt;
&lt;li data-path-to-node=&quot;8&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;다른 파일에서 불러올 때:&lt;/b&gt; __name__ 변수는 파일 이름이 됩니다. 따라서 if 조건이 거짓이 되어 main()이 자동으로 실행되지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 브라우저 구동 및 로그인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1781018957341&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chrome_options = Options()
chrome_options.add_experimental_option(&quot;detach&quot;, True)

# 불필요한 에러메시지 노출 방지
chrome_options.add_experimental_option(&quot;excludeSwitches&quot;, [&quot;enable-logging&quot;])

service = Service(excutable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options = chrome_options)

time.sleep(2)
driver.implicitly_wait(5)
driver.maximize_window()

driver.get(&quot;https://nid.naver.com/nidlogin.login?mode=form&amp;amp;url=https://www.naver.com/&quot;)

# 아이디 입력창
id = driver.find_element(By.CSS_SELECTOR, &quot;#input_item_id&quot;)
id.click()

pyperclip.copy(uid)
pyautogui.hotkey(&quot;ctrl&quot;,&quot;v&quot;)
time.sleep(2)

# 비밀번호 입력 창
pw = driver.find_element(By.CSS_SELECTOR, &quot;#input_item_pw&quot;)
pw.click()

pyperclip.copy(pwd)
pyautogui.hotkey(&quot;ctrl&quot;,&quot;v&quot;)
time.sleep(2)

login_btn = driver.find_element(By.CSS_SELECTOR, &quot;#log\\.login&quot;)
login_btn.click()

time.sleep(30)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;detach 옵션:&lt;/b&gt; 코드가 끝난 뒤 브라우저가 바로 닫히지 않고 열려 있게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;로그인 로직:&lt;/b&gt; CSS Selector(input_item_id, input_item_pw)를 사용해 아이디와 비밀번호 필드를 찾습니다. 이후 클립보드 복사 &amp;rarr; 붙여넣기 방식으로 입력 후 로그인 버튼을 클릭합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,2,0&quot;&gt;time.sleep(30):&lt;/b&gt; 네이버의 보안 문자가 뜰 경우를 대비해 사용자가 직접 30초 동안 캡차(CAPTCHA)를 처리할 시간을 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 메일 쓰기 화면 창 넘어가기 및 메일쓰기 (메일 버튼, 메일 받는 사람, 메일 제목)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1781051043312&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mail_btn = driver.find_element(By.CSS_SELECTOR, &quot;li.shortcut_item a&quot;)
mail_btn.click()

time.sleep(2)

# 윈도우창 핸들링
windows = driver.window_handles
# 새로 열린 창으로 이동
driver.switch_to.window(windows[-1])

# 메일 버튼
write_btn = driver.find_element(By.CSS_SELECTOR, &quot;a.button_write&quot;)
write_btn.click()

time.sleep(2)

# 메일 받는 사람
to_email = driver.find_element(By.CSS_SELECTOR, &quot;#recipient_input_element&quot;)
to_email.click()

time.sleep(1)

pyperclip.copy(tomail)
pyautogui.hotkey(&quot;ctrl&quot;, &quot;v&quot;)

# 메일 제목
subject_email = driver.find_element(By.CSS_SELECTOR, &quot;#subject_title&quot;)
subject_email.click()
pyperclip.copy(to_subject)
pyautogui.hotkey(&quot;ctrl&quot;, &quot;v&quot;)

time.sleep(2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네이버 메일의 '메일 쓰기'는 새로운 탭(창)에서 열리므로 window_handles를 통해 마지막으로 열린 창으로 포커스를 이동합니다.&lt;/li&gt;
&lt;li&gt;CSS Selector를 사용해 메일쓰기버튼을 누른 후 메일 받는 사람, 메일 제목 필드를 찾습니다. 이후 클립보드 복사 &amp;rarr; 붙여넣기 방식으로 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;#&lt;span&gt;&amp;nbsp;&lt;/span&gt;iframe 제어 및 내용 입력 (메일 본문 작성)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1781051777238&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# iframe으로 이동
WebDriverWait(driver, 10).until(
    EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, &quot;#content &amp;gt; div.contents_area &amp;gt; div &amp;gt; div.editor_area &amp;gt; div &amp;gt; div.editor_body &amp;gt; iframe&quot;))
)

time.sleep(2)

# 내용칸 로드후 다음 진행
mail_content = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, &quot;div.workseditor-content&quot;))
)

# 내용 붙여넣기
mail_content.click()
pyperclip.copy(to_content)
pyautogui.hotkey(&quot;ctrl&quot;,&quot;v&quot;)

time.sleep(2)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네이버 메일의 에디터는 iframe이라는 '페이지 안의 페이지' 구조로 되어 있습니다. 셀레늄은 기본 페이지에만 접근할 수 있으므로, 반드시 switch_to.frame을 통해 에디터 영역으로 진입해야 내용 작성이 가능합니다.&lt;/li&gt;
&lt;li&gt;iframe 내부의 본문 영역을 찾아 클릭하고, 앞서 복사해둔 내용을 Ctrl+V로 붙여넣습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* iframe으로 전환 후 바로 클릭하고 붙여넣기 못하고 내용칸 로드될 때까지 기다려야하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;3&quot;&gt;1. 브라우저의 비동기 렌더링 (가장 큰 이유)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;3&quot;&gt;웹 브라우저는 페이지를 불러올 때 모든 요소를 한 번에 다 보여주지 않습니다. 특히 메일 서비스처럼 복잡한 에디터는 다음과 같은 순서로 작동합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;3&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;프레임(iframe) 로드:&lt;/b&gt; 먼저 큰 틀인 빈 박스(iframe)가 먼저 생성됩니다.&lt;/li&gt;
&lt;li data-path-to-node=&quot;3&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;내부 엔진 로드:&lt;/b&gt; 그 안에서 자바스크립트가 실제 글을 쓸 수 있는 에디터 영역(div.workseditor-content)을 동적으로 생성하고, 각종 서식 툴바를 입힙니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;이 과정에서 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;6&quot;&gt;iframe이라는 '빈 껍데기'가 생성된 직후에 click()을 수행하면, 정작 내부에 글을 쓸 실제 영역인 div는 아직 브라우저에 존재하지 않을 확률이 매우 높습니다.&lt;/b&gt; 결과적으로 NoSuchElementException 에러가 발생하게 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;7&quot;&gt;2. 동적 로딩과 JavaScript의 한계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;7&quot;&gt;네이버 메일 같은 현대적인 웹사이트는 대부분 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;8&quot;&gt;SPA(Single Page Application)&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 방식을 사용합니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;7&quot;&gt;iframe 태그가 HTML에 나타났다고 해서 그 내부의 기능이 완벽하게 초기화(Initialize)된 것은 아닙니다.&lt;/li&gt;
&lt;li data-path-to-node=&quot;7&quot;&gt;&quot;내용칸 로드 후 진행&quot;한다는 것은, 단순히 요소가 존재하는지 확인하는 것을 넘어 &quot;브라우저가 해당 영역에 사용자의 입력을 받을 준비를 마쳤는지(Ready 상태)&quot;를 확인하는 필수적인 과정입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 최종 전송&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1781052273496&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 원래 창으로 돌아가기
driver.switch_to.default_content()

# 보내기 버튼
mail_send = driver.find_element(By.CSS_SELECTOR, &quot;#content &amp;gt; div.mail_toolbar.type_write &amp;gt; div:nth-child(1) &amp;gt; div &amp;gt; button.button_write_task&quot;)
mail_send.click()

time.sleep(3)
driver.quit()&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;default_content()를 호출해 다시 메인 페이지로 돌아와 '보내기' 버튼을 누릅니다.&lt;/li&gt;
&lt;li&gt;그 후 diver.quit()로 종료합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;느낀점&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어제 Selenium 개념은 알았지만 제대로 써보지 못해 오늘 네이버 메일 보내기 자동화로 Selenium을 써보았다. 확실히 요즘 반복된 업무를 자동화하는 게 나름 중요한 시대라고 생각되는데, 파이썬으로 자동화하는데 Selenium을 통해 편하게 할 수 있는 거 같아 나중에 기본 틀을 만들어두면 유용하게 사용할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-58&quot; data-tistory-react-app=&quot;Reaction&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학습일지</category>
      <category>#한컴AI아카데미 #AI개발자 #AI개발자교육 #한글과컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업</category>
      <author>cd-record</author>
      <guid isPermaLink="true">https://cd-record.tistory.com/59</guid>
      <comments>https://cd-record.tistory.com/59#entry59comment</comments>
      <pubDate>Wed, 10 Jun 2026 00:29:50 +0900</pubDate>
    </item>
  </channel>
</rss>