<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ideas9064 님의 블로그</title>
    <link>https://ideas9064.tistory.com/</link>
    <description>ideas9064 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 5 Aug 2026 03:55:02 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ideas9064</managingEditor>
    <item>
      <title>ABC 부트캠프 AI파일럿 1기 MLOps 6일차_탐색적 데이터 분석(EDA) 실습</title>
      <link>https://ideas9064.tistory.com/41</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘의 학습 요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EDA의 표준 흐름인 데이터 로드, 구조 파악, 기초 통계량 확인, 결측&amp;middot;중복 점검, 변수별 분포 분석, 변수 간 관계 분석, 상관관계 분석 순서를 타이타닉 데이터셋에 적용하였다. 목표 변수는 생존 여부(&lt;code&gt;survived&lt;/code&gt;)로 설정하고 성별, 객실 등급, 승선 항구, 나이, 요금 등의 변수를 중심으로 분석을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분석 도구는 pandas의 &lt;code&gt;describe&lt;/code&gt;, &lt;code&gt;value_counts&lt;/code&gt;, &lt;code&gt;groupby&lt;/code&gt;, &lt;code&gt;crosstab&lt;/code&gt;과 seaborn의 &lt;code&gt;countplot&lt;/code&gt;, &lt;code&gt;histplot&lt;/code&gt;, &lt;code&gt;boxplot&lt;/code&gt;, &lt;code&gt;heatmap&lt;/code&gt;을 조합하였다. 이어서 &lt;code&gt;sibsp&lt;/code&gt;, &lt;code&gt;parch&lt;/code&gt;를 합산한 &lt;code&gt;family_size&lt;/code&gt;, 15세 이하 여부를 나타내는 &lt;code&gt;is_child&lt;/code&gt;, &lt;code&gt;pd.cut&lt;/code&gt;으로 구간화한 &lt;code&gt;age_group&lt;/code&gt; 파생변수를 생성하고 그룹별 생존율을 확인하였다. 마지막으로 범주형 변수를 &lt;code&gt;map&lt;/code&gt;과 &lt;code&gt;pd.get_dummies&lt;/code&gt;로 수치화한 뒤 상관관계 히트맵으로 시각화하였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0.타이타닉 탑승객 데이터 탐색적 데이터 분석(EDA)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이타닉 탑승객 데이터를 활용한 탐색적 데이터 분석( &lt;b&gt;Exploratory Data Analysis, EDA)&lt;/b&gt; 의 전체 과정을 학습하는 시간을 가졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/li&gt;
&lt;li&gt;기초 통계량과 범주별 빈도 확인&lt;/li&gt;
&lt;li&gt;결측치와 중복 데이터를 탐색&lt;/li&gt;
&lt;li&gt;범주형 변수와 수치형 변수를 구분하여 분석&lt;/li&gt;
&lt;li&gt;&lt;code&gt;groupby()&lt;/code&gt;, &lt;code&gt;crosstab()&lt;/code&gt;, &lt;code&gt;pivot_table()&lt;/code&gt;을 활용&lt;/li&gt;
&lt;li&gt;분석 결괄를 근거로 데이터 특징 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. EDA 개념과 표준 절차&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EDA는 본격적인 분석이나 머신러닝 이전 단계에서 데이터를 살펴보는 과정이다. 일반적으로 다음 8단계 순서를 따른다.&lt;/p&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;데이터 구조 확인&lt;/li&gt;
&lt;li&gt;기초 통계량 확인&lt;/li&gt;
&lt;li&gt;결측치와 중복 데이터 확인&lt;/li&gt;
&lt;li&gt;변수별 분포 분석&lt;/li&gt;
&lt;li&gt;변수 간 관계 분석&lt;/li&gt;
&lt;li&gt;상관관계 분석&lt;/li&gt;
&lt;li&gt;분석 결과 정리&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;EDA가 시사하는 점이 뭘까?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EDA는 단순한 사전 확인이 아니라 파이프라인의 품질을 좌우하는 단계라 볼 수 있다. EDA에서 확인한 결측 패턴,범주 분포, 상관관계는 전처리 로직에 근거가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 데이터 로드와 초기 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;koreanize-matplotlib&lt;/code&gt; 패키지로 한글 폰트 문제를 해결하고, 실수 출력 자릿수와 기본 그래프 크기를 사전에 지정하였다. 원본 훼손을 방지하기 위해 &lt;code&gt;df.copy()&lt;/code&gt;로 복사본을 만들어 &lt;code&gt;titanic_df&lt;/code&gt;로 사용하였다.&lt;/p&gt;
&lt;pre class=&quot;xl&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import koreanize_matplotlib

plt.rcParams['figure.figsize'] = (8, 5)
pd.options.display.float_format = '{:.3f}'.format

df = sns.load_dataset('titanic')
titanic_df = df.copy()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컬럼 설명&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;컬럼명&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;survived&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;생존 여부 (0 = 사망, 1 = 생존)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;pclass&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;객실 등급 (1 = 1등석, 2 = 2등석, 3 = 3등석)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;sex&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;성별 (male, female)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;age&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;나이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;sibsp&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;함께 탑승한 형제&amp;middot;자매 및 배우자 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;parch&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;함께 탑승한 부모 및 자녀 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;fare&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;승선 요금&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;embarked&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;승선 항구 코드 (C, Q, S)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;class&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;객실 등급 (First, Second, Third)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;who&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;승객 구분 (man, woman, child)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;adult_male&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;성인 남성 여부 (True / False)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;deck&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;객실이 위치한 갑판(A~G), 결측치 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;embark_town&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;승선 도시 (Cherbourg, Queenstown, Southampton)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;alive&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;생존 여부 (yes / no)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;alone&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;혼자 탑승 여부 (True / False)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;---&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 기초 통계량 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치형 컬럼만 대상으로 하는 기본 &lt;code&gt;describe()&lt;/code&gt;와 달리, &lt;code&gt;include='all'&lt;/code&gt;을 지정하면 범주형 변수까지 포함한 통계량을 볼 수 있다. &lt;code&gt;nunique()&lt;/code&gt;로 컬럼별 고유값 개수도 함께 확인한다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;titanic_df.describe(include='all')
titanic_df.nunique()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통계량 점검 시 확인해야 할 요소는 평균과 중앙값의 격차(불균형), 최솟값&amp;middot;최댓값의 편차(범위), 데이터 개수가 전체 행 수보다 적은 컬럼(결측), 범주형 변수의 최빈값이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 데이터 품질 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결측치와 중복 데이터를 각각 &lt;code&gt;isna().sum()&lt;/code&gt;, &lt;code&gt;duplicated().sum()&lt;/code&gt;으로 파악한다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;titanic_df.isna().sum()
print('중복 행 개수: ', titanic_df.duplicated().sum())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결측치가 확인되어도 무조건 삭제하지 않으며, 재수집 또는 파생변수로 채워 활용하는 것을 우선한다. 타이타닉 데이터는 이름&amp;middot;승객 번호가 포함되지 않으므로 다른 승객의 값이 우연히 동일할 수 있어 단순 중복 제거도 지양한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 목표 변수 분석: 생존 여부&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;value_counts&lt;/code&gt;에 &lt;code&gt;normalize=True&lt;/code&gt;를 지정하면 인원수 대신 비율(0~1)이 반환되며, 여기에 100을 곱해 백분율로 변환한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;titanic_df['survived'].value_counts(normalize=True) * 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시각화는 &lt;code&gt;sns.countplot&lt;/code&gt;으로 인원수를, 파이차트로 비율을 확인하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjG7Th/dJMcahZCouH/frbl9MpM56lUEfW2QZJVpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjG7Th/dJMcahZCouH/frbl9MpM56lUEfW2QZJVpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjG7Th/dJMcahZCouH/frbl9MpM56lUEfW2QZJVpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjG7Th%2FdJMcahZCouH%2Ffrbl9MpM56lUEfW2QZJVpK%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;718&quot; height=&quot;491&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 범주형 변수 분포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성별의 경우 인원수와 비율을 하나의 DataFrame으로 묶어 정리하였다. 승선 항구는 결측 포함 빈도를 함께 보기 위해 &lt;code&gt;dropna=False&lt;/code&gt;를 사용한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sex_table = pd.DataFrame({
    '인원수': titanic_df['sex'].value_counts(),
    '비율(%)': titanic_df['sex'].value_counts(normalize=True) * 100
})

titanic_df['embark_town'].value_counts(dropna=False)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 수치형 변수 분포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;histplot&lt;/code&gt;에&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sns.histplot(data=titanic_df, x='age', bins=20, kde=True)
sns.boxplot(data=titanic_df, x='fare')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;fare&lt;/code&gt;는 오른쪽으로 긴 꼬리를 가진 분포로 확인되어, 평균만으로는 전체 승객의 요금 특성을 설명하기 어렵다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xU0MQ/dJMb99UQkYP/2kRkkuNkQUkT4Vuj5zR0p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xU0MQ/dJMb99UQkYP/2kRkkuNkQUkT4Vuj5zR0p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xU0MQ/dJMb99UQkYP/2kRkkuNkQUkT4Vuj5zR0p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxU0MQ%2FdJMb99UQkYP%2F2kRkkuNkQUkT4Vuj5zR0p1%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;767&quot; height=&quot;506&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 범주형 변수와 생존 여부의 관계 &quot;pd.crosstab()&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개 이상의 범주형 변수의 교차 빈도를 확인할 때 &lt;code&gt;pd.crosstab()&lt;/code&gt;을 사용한다. 그룹별 탑승자 수, 생존자 수, 생존율은 &lt;code&gt;groupby&lt;/code&gt;와 &lt;code&gt;agg(['count', 'sum', 'mean'])&lt;/code&gt;로 한 번에 산출한다.&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;#1
pd.crosstab(titanic_df['sex'], titanic_df['survived'])

#2
survived_df = titanic_df.groupby('sex')['survived'].agg(['count', 'sum', 'mean'])
survived_df.columns = ['탑승자 수', '생존자 수', '생존율']
survived_df['생존율'] = survived_df['생존율'] * 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 방식으로 &lt;code&gt;pclass&lt;/code&gt;, &lt;code&gt;embark_town&lt;/code&gt;에 대해서도 &lt;code&gt;class_survived_df&lt;/code&gt;, &lt;code&gt;embark_survived_df&lt;/code&gt;를 생성하였다. &lt;code&gt;survived&lt;/code&gt;가 0/1 이진값이므로 &lt;code&gt;sum&lt;/code&gt;은 생존자 수, &lt;code&gt;mean&lt;/code&gt;은 생존율에 대응된다는 점이 핵심이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1eSI8/dJMcacxislO/CkzzWKd3kaKOQ9lukAH3vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1eSI8/dJMcacxislO/CkzzWKd3kaKOQ9lukAH3vk/img.png&quot; style=&quot;width: 27.4991%; margin-right: 10px;&quot; data-origin-width=&quot;193&quot; data-origin-height=&quot;152&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;28.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1eSI8/dJMcacxislO/CkzzWKd3kaKOQ9lukAH3vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1eSI8%2FdJMcacxislO%2FCkzzWKd3kaKOQ9lukAH3vk%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;193&quot; height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2w7Ym/dJMcaixxInk/CvRcPJwi7nFobJgLbDRxh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2w7Ym/dJMcaixxInk/CvRcPJwi7nFobJgLbDRxh1/img.png&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;158&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.8225%;&quot; data-widthpercent=&quot;45.89&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2w7Ym/dJMcaixxInk/CvRcPJwi7nFobJgLbDRxh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2w7Ym%2FdJMcaixxInk%2FCvRcPJwi7nFobJgLbDRxh1%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;327&quot; height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 파생변수 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치형 변수를 범주형으로 재가공하여 분석 정확도를 높이는 단계이다. 세 종류의 파생변수를 생성하였다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;파생변수&lt;/th&gt;
&lt;th&gt;정의&lt;/th&gt;
&lt;th&gt;생성 방식&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;family_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;본인 포함 동승 가족 수&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sibsp + parch + 1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;is_child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15세 이하 여부&lt;/td&gt;
&lt;td&gt;&lt;code&gt;age &amp;lt;= 15&lt;/code&gt; 불리언&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;age_group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;연령대 구간&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pd.cut&lt;/code&gt; 5구간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;titanic_df['family_size'] = titanic_df['sibsp'] + titanic_df['parch'] + 1
titanic_df['is_child'] = titanic_df['age'] &amp;lt;= 15

titanic_df['age_group'] = pd.cut(
    titanic_df['age'],
    bins=[0, 15, 30, 45, 60, np.inf],
    labels=['15세 이하', '16~30세', '31~45세', '46~60세', '60세 이상']
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;pd.cut&lt;/code&gt;은 &lt;code&gt;bins&lt;/code&gt;로 경계값을, &lt;code&gt;labels&lt;/code&gt;로 각 구간의 이름을 지정한다. 상한을 &lt;code&gt;np.inf&lt;/code&gt;로 지정하면 최댓값에 관계없이 마지막 구간이 열려 있는 형태로 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파생변수별 생존율은 앞선 groupby 패턴을 그대로 재사용하여 &lt;code&gt;family_size_survived_df&lt;/code&gt;, &lt;code&gt;age_group_survived_df&lt;/code&gt;로 산출하였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 상관관계 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치형 변수만 선별한 후 &lt;code&gt;corr()&lt;/code&gt;로 피어슨 상관계수 행렬을 계산하고 &lt;code&gt;heatmap&lt;/code&gt;으로 시각화하였다.&lt;br /&gt;&lt;code&gt;corr()&lt;/code&gt;메서드는 데이터프레임의 수치형 변수들 간의 상관관계를 계산하는 메서드이며, 상관관계는 두 변수 사이의 관계가 강한지를 나타낸다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;numberic_columns = ['survived', 'pclass', 'age', 'sibsp', 'parch', 'fare', 'family_size']
corr_df = titanic_df[numberic_columns].corr()

sns.heatmap(
    data=corr_df,
    annot=True,
    fmt='.2f',
    cmap='coolwarm',
    center=0,
    linewidths=0.5,
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQUlu/dJMcad3Yd1Y/NdJrpaDiAX8zhDubGkNyVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQUlu/dJMcad3Yd1Y/NdJrpaDiAX8zhDubGkNyVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQUlu/dJMcad3Yd1Y/NdJrpaDiAX8zhDubGkNyVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQUlu%2FdJMcad3Yd1Y%2FNdJrpaDiAX8zhDubGkNyVk%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;745&quot; height=&quot;652&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상관계수 해석 기준은 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상관계수 범위&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;완전한 양의 상관관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.7 ~ 1.0&lt;/td&gt;
&lt;td&gt;매우 강한 양의 상관관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.3 ~ 0.7&lt;/td&gt;
&lt;td&gt;보통의 양의 상관관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-0.3 ~ 0.3&lt;/td&gt;
&lt;td&gt;거의 관계 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-0.3 ~ -0.7&lt;/td&gt;
&lt;td&gt;보통의 음의 상관관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-0.7 ~ -1.0&lt;/td&gt;
&lt;td&gt;매우 강한 음의 상관관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-1.0&lt;/td&gt;
&lt;td&gt;완전한 음의 상관관계&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상관관계는 인과관계를 의미하지 않는다. &lt;code&gt;survived&lt;/code&gt; 기준으로 &lt;code&gt;pclass&lt;/code&gt;는 음의 상관관계, &lt;code&gt;fare&lt;/code&gt;는 양의 상관관계를 보였다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. 범주형 변수를 포함한 상관관계 재분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범주형 변수는 상관계수 계산 대상에서 제외되므로 수치화가 필요하다. 이진 범주는 &lt;code&gt;map&lt;/code&gt;, 다중 범주는 &lt;code&gt;pd.get_dummies&lt;/code&gt;로 원-핫 인코딩한다.&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;corr_df = titanic_df[[
    'survived', 'sex', 'pclass', 'embarked', 'fare', 'family_size', 'age'
]]

corr_df['sex'] = corr_df['sex'].map({'male': 0, 'female': 1})

corr_df = pd.get_dummies(
    corr_df,
    columns=['embarked'],
    dtype=int
)

corr_df = corr_df.corr()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;get_dummies&lt;/code&gt;의 &lt;code&gt;dtype=int&lt;/code&gt; 옵션을 지정하면 True/False가 아닌 1/0 정수로 인코딩되어 이후 상관계수 계산에 그대로 사용할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘의 핵심 포인트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EDA는 데이터 로드 &amp;rarr; 구조&amp;middot;통계&amp;middot;품질 확인 &amp;rarr; 분포 &amp;rarr; 관계 &amp;rarr; 상관관계의 8단계 표준 절차를 따른다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;describe(include='all')&lt;/code&gt;은 범주형 컬럼까지 포함한 통계량을, &lt;code&gt;nunique()&lt;/code&gt;는 컬럼별 고유값 개수를 반환한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;value_counts&lt;/code&gt;의 &lt;code&gt;normalize=True&lt;/code&gt;는 비율을, &lt;code&gt;dropna=False&lt;/code&gt;는 결측 포함 빈도를 산출한다.&lt;/li&gt;
&lt;li&gt;이진 목표 변수에 대해 &lt;code&gt;groupby(...).agg(['count', 'sum', 'mean'])&lt;/code&gt;을 적용하면 탑승자 수&amp;middot;생존자 수&amp;middot;생존율을 한 번에 얻는다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pd.cut&lt;/code&gt;은 &lt;code&gt;bins&lt;/code&gt;와 &lt;code&gt;labels&lt;/code&gt;로 수치형 변수를 명명된 범주 구간으로 변환하며, &lt;code&gt;np.inf&lt;/code&gt;로 개방 구간을 지정한다.&lt;/li&gt;
&lt;li&gt;결측&amp;middot;중복 데이터는 즉시 삭제하지 않고 데이터 특성(재수집 가능성, 식별자 부재 등)을 근거로 처리 방침을 결정한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;corr()&lt;/code&gt;는 수치형 변수만 대상으로 하므로 범주형 변수는 &lt;code&gt;map&lt;/code&gt; 또는 &lt;code&gt;pd.get_dummies(dtype=int)&lt;/code&gt;로 사전 변환이 필요하다.&lt;/li&gt;
&lt;li&gt;상관관계와 인과관계는 구분되며, 히트맵 해석은 상관계수 구간표를 기준으로 강도와 방향을 판단한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>MLOps엔지니어</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/41</guid>
      <comments>https://ideas9064.tistory.com/41#entry41comment</comments>
      <pubDate>Tue, 4 Aug 2026 16:11:47 +0900</pubDate>
    </item>
    <item>
      <title>ABC 부트캠프 AI파일럿 1기 MLOps 5일차_주민등록 인구통계 CSV 전처리와 plotly 시각화</title>
      <link>https://ideas9064.tistory.com/40</link>
      <description>&lt;h2 data-heading=&quot;01. 판다스 전처리 메서드 마무리&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;01. 판다스 전처리 메서드 마무리&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전날 실습에서 남아 있던 세 개 메서드를 정리하였다. 이 세 가지는 오늘 인구 데이터 분석 전 과정에서 반복적으로 사용되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;메서드 기능 핵심 주의점&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;drop(columns=[...])&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;컬럼 삭제&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;결과를 리턴만 하므로 변수에 재할당하거나 inplace=True를 명시해야 실제로 반영된다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;sort_values(by=...)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정렬&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;아무 옵션도 주지 않으면 오름차순이다. 내림차순이 필요할 때 ascending=False를 준다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;assign(컬럼명=연산식)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파생변수 생성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;sort_values는 by에 컬럼 리스트를 주면 첫 번째 컬럼을 1차 기준으로, 두 번째 컬럼을 동점 처리 기준으로 정렬한다. 정렬 방향이 컬럼마다 다를 경우 ascending에도 리스트를 전달하여 위치별로 지정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;강사는 분석 결과에서 정렬 기준이 곧 결과의 품질을 결정한다는 점을 강조하였다. 지자체 대상 보고에서는 어떤 기준으로 정렬했는지가 별도의 설명 대상이 된다는 실무 사례를 함께 제시하였다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;02. 데이터 적재와 1차 진단&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;02. 패키지 임포트&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;패키지 구성은 데이터 분석용과 시각화용을 분리하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;import numpy as np
import pandas as pd

# 시각화
import plotly.express as px
import plotly.graph_objects as go
&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;plotly를 선택한 이유는 데이터프레임을 그대로 입력으로 받기 때문이다. matplotlib은 x축과 y축에 수치 시퀀스를 직접 넘겨야 하지만, plotly express와 graph_objects는 데이터프레임을 넘기고 축을 컬럼명 문자열로 지정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;03. 필요 컬럼 추출&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;03. 필요 컬럼 추출&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;컬럼이 41개인데 필요한 것은 총인구수 10개와 행정구역 1개뿐이다. 컬럼명을 일일이 나열하는 대신 리스트 컴프리헨션으로 추출하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 컬럼명 추출
# [리스트에 담을 값 for 변수 이름 in 반복할 아이템 if 조건문 ]
col_list = [x for x in df.columns if '총인구수' in x]

# 행정구역 컬럼
col_list.insert(0,'행정구역')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;df.columns는 데이터프레임이 가진 컬럼명을 인덱스 객체로 반환하는 속성이다. in 연산자로 문자열 포함 여부를 판정하여 '총인구수'가 들어간 컬럼명 10개만 걸러냈다.&lt;/span&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;append가 아닌 insert(0, '행정구역')를 사용한 이유는 위치 때문이다. append를 쓰면 행정구역이 맨 뒤로 밀려 분석할 때마다 좌우로 이동해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;population_df = df.loc[:,col_list] # loc[행, 열]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;loc는 location의 약자로 행과 열의 위치를 지정하여 데이터를 추출한다. 행 자리의 콜론은 전체를 의미한다. 전날 배운 query가 조건에 맞는 데이터를 추출하는 것과 달리 loc는 조건 없이 지정한 위치의 데이터를 가져온다는 점이 다르다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;04. 행정코드 제거와 행&amp;middot;열 전치&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;04. 행정코드 제거와 행&amp;middot;열 전치&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;행정구역 값은 서울특별시 (1100000000) 형태로 행정코드가 붙어 있다. 행정코드는 통계청 지도 서비스 등에서 실제 서비스 기준으로 사용되는 코드지만 이번 분석에서는 시각화 라벨을 방해한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열 슬라이싱으로 자를 수 없는 이유는 행정구역명의 글자 수가 제각각이어서 괄호가 시작되는 인덱스 위치가 일정하지 않기 때문이다. 따라서 인덱스가 아닌 키워드 기준으로 잘라야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;# 서울특별시 (11000000000) -&amp;gt; 전국
# 소괄호 ( 기준으로 잘라내서 앞부분의 행정명에 앞뒤 공백을 제거하고 행정명만 다시 담기
population_df['행정구역']=population_df['행정구역'].str.split('(').str.get(0).str.strip()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;세 단계 메서드 체인이다. str.split('(')는 여는 괄호를 기준으로 문자열을 잘라 리스트로 반환하고, str.get(0)은 그중 0번째 조각만 가져오며, str.strip()은 앞뒤 공백을 제거한다. strip()이 필요한 이유는 원본이 서울특별시 ( 형태로 괄호 앞에 공백이 하나 있어 분리 후에도 뒤에 공백이 남기 때문이다. 눈으로는 구분되지 않지만 처리하지 않으면 정확한 값이 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이어서 행과 열을 뒤집었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;population_df = population_df.set_index('행정구역').T
population_df = population_df.drop(columns = '전국')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전치가 필요한 이유는 시각화 형태에서 역산된다. x축에 연도, y축에 인구수를 두려면 지역이 컬럼으로 매칭되어야 한다. 수치를 가진 데이터는 로우에, 기준이 되는 항목은 컬럼에 있어야 집계와 시각화가 모두 쉬워진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전국 컬럼은 값의 크기가 다른 시도와 자릿수 자체가 달라 분석 때마다 제외 처리를 해야 하므로 삭제하였다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;05. 콤마 제거와 결측치 병합&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;05. 콤마 제거와 결측치 병합&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;수치형 변환에 앞서 콤마를 먼저 제거하였다. 콤마가 남아 있는 상태로 형변환을 요청하면 오류가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;# 특수기호(,) 삭제하기
# replace(찾을문자, 바꿀 문자),regex=True,inplace =True
population_df.replace(',','',regex=True,inplace =True)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;regex=True는 정규 표현식(Regular Expression) 적용 여부를 묻는 옵션이다. 콤마는 일반 문자가 아니라 기호이므로 이 옵션을 주지 않으면 치환이 이루어지지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;#결측지 확인
population_df.isna().sum()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;isna()는 각 셀이 결측인지 여부를 True/False로 반환하고, sum()은 True만 더하므로 컬럼별 결측 건수가 집계된다. 결과는 다음과 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;컬럼 결측 건수&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;강원도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;강원특별자치도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;7&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전라북도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전북특별자치도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;8&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;원인은 행정구역 명칭 변경이다. 강원도는 2023년부터 강원특별자치도로, 전라북도는 2024년부터 전북특별자치도로 바뀌었다. 실제 데이터를 출력해 확인한 결과 강원도는 2015~2022년에 값이 있고 2023~2024년이 결측, 강원특별자치도는 2023~2024년에만 값이 있었다. 겹치는 구간이 없다는 것을 눈으로 확인한 뒤 병합을 진행하였다. 겹치는 구간이 있으면 더했을 때 인구수가 두 배가 되기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# NaN 데이터(아직 정의 되지 않은 값, 연산이 불가능) 처리 -&amp;gt; 강원도 컬럼 데이터를 강원특별자치도 컬럼으로 통합
# 처리 순서: NaN 데이터 -&amp;gt; 형변환 -&amp;gt; 0으로 채우기 -&amp;gt; 강원도 컬럼 데이터 강원특별자치도로 통합
population_df['강원특별자치도']=population_df['강원도'].astype(float).fillna(0) + population_df['강원특별자치도'].astype(float).fillna(0)

population_df['전북특별자치도']=population_df['전라북도'].astype(float).fillna(0) + population_df['전북특별자치도'].astype(float).fillna(0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;int가 아니라 float로 먼저 변환하는 이유는 실수형이 정수형을 포함하는 더 큰 범위이기 때문이다. 최초 형변환은 가장 큰 범위의 자료형으로 하고, 모든 처리가 끝난 뒤 정수형으로 좁히는 것이 안전하다. fillna(0)은 결측을 0으로 채워 덧셈 연산이 가능한 상태로 만든다. 반대로 결측 행 자체를 제거하는 dropna()도 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;population_df.drop(columns=['강원도','전라북도'], inplace =True)
population_df = population_df.astype(int)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;병합 후 원본 컬럼 2개를 삭제하여 17개 시도 컬럼만 남겼다. 마지막으로 전체를 int로 변환하여 17개 컬럼 모두 int64가 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;형변환을 마지막에 수행하는 이유는 결측치가 남아 있는 상태에서 형변환을 시도하면 오류 가능성이 크고, 오류가 나면 결측 처리 후 다시 형변환을 반복해야 하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;06. 전처리 결과 저장과 재로딩&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;06. 전처리 결과 저장&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;population_df.to_csv('201512_202412_주민등록인구및세대현황_연간_전국_20260728.csv',
                     encoding ='utf-8-sig',index_label = ['연도'])
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;read_csv가 읽기라면 to_csv는 쓰기다. 확장자까지 파일명에 포함해야 한다.&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;encoding='utf-8-sig' : 원본은 EUC-KR이지만 정제한 결과물은 UTF-8로 저장한다. 일반 utf-8로 저장해도 한글이 깨지는 경우가 있어 BOM이 포함된 utf-8-sig를 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;index_label=['연도']: 지정하지 않으면 인덱스 컬럼명이 비어 있는 상태로 저장된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;07. 시각화 &amp;mdash; 17개 시도 전체와 단일 지역&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;07. 시각화 &amp;mdash; 17개 시도 전체와 단일 지역&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;17개 시도를 하나의 차트에 겹쳐 그리려면 도화지를 먼저 준비하고 시도별 그래프를 반복해서 추가하는 방식을 쓴다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;#차트 시각화 -&amp;gt; x축(가로, 연도), y축(세로, 총인구수)
#17개 시도의 연도별 총인구수의 변화를 하나의 차트로 시각화

fig = go.Figure() # 도화지 하나를 준비하는 단계

for location in pop_df.columns[1:]: # 서울특별시부터 시작 1번째 인덱스 설정. 0번째는 연도
  fig.add_trace(
      go.Scatter(
          x=pop_df['연도'],
          y=pop_df[location], # 지역의 컬럼명
          name=location #범례
      )
  )  #하나의 도화지에 이어서 계속 추가시킴
  fig.update_layout(title = '대한민국 시도별 2015~2024년 총 인구수 변화')
  fig.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;pop_df.columns[1:]로 1번 인덱스부터 순회하는 이유는 0번이 연도 컬럼이기 때문이다. add_trace는 준비된 도화지에 그래프를 계속 추가하는 역할이고, 실제 그리기는 go.Scatter 안에서 이루어진다. name은 범례로 표시된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boPxVU/dJMcacKSZ5V/F8XbRksN7vVny767578gm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boPxVU/dJMcacKSZ5V/F8XbRksN7vVny767578gm1/img.png&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;466&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.4858%; margin-right: 10px;&quot; data-widthpercent=&quot;48.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boPxVU/dJMcacKSZ5V/F8XbRksN7vVny767578gm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboPxVU%2FdJMcacKSZ5V%2FF8XbRksN7vVny767578gm1%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;1608&quot; height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pyhya/dJMb99UPorM/3XEw3Ub8gxcFABfHaDnUYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pyhya/dJMb99UPorM/3XEw3Ub8gxcFABfHaDnUYK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;447&quot; data-origin-width=&quot;1668&quot; style=&quot;width: 51.3514%;&quot; data-widthpercent=&quot;51.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pyhya/dJMb99UPorM/3XEw3Ub8gxcFABfHaDnUYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPyhya%2FdJMb99UPorM%2F3XEw3Ub8gxcFABfHaDnUYK%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;1668&quot; height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/div&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;단일 지역은 plotly.express로 한 줄에 그릴 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;fig = px.scatter(pop_df,x='연도', y='대전광역시', text ='대전광역시',
                 title ='대전광역시 2015~2024년 총 인구수 변화')
fig.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;text 속성을 지정하면 각 데이터 포인트 위에 실제 값이 출력된다. 지정하지 않으면 점만 표시된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1681&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgmst0/dJMcahekbq6/W7yaQkF3BRb1zAubabkz10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgmst0/dJMcahekbq6/W7yaQkF3BRb1zAubabkz10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgmst0/dJMcahekbq6/W7yaQkF3BRb1zAubabkz10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgmst0%2FdJMcahekbq6%2FW7yaQkF3BRb1zAubabkz10%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;1681&quot; height=&quot;458&quot; data-origin-width=&quot;1681&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;08. 전국 인구 집계와 axis&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;08. 전국 인구 집계와 axis&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;앞서 전국 컬럼을 삭제했으므로 17개 시도를 합산하여 전국 인구를 다시 만들어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;#1) 17개 시도 컬럼명 리스트
region_col = pop_df.columns.drop('연도')

#2) 연도별 지역별 인구를 모두 합하여 전국인구 파생변수를 생성
pop_df = pop_df.assign(전국인구 = pop_df[region_col].sum(axis=1)) # 연도별로 전체 인구수 합계
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;pop_df.columns.drop('연도')는 실제로 컬럼을 삭제하는 것이 아니라 연도를 제외한 컬럼명 리스트만 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;핵심은 axis 값이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;axis 연산 방향 이 데이터에서의 의미&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;axis=0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;컬럼 단위 집계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;서울특별시의 2015~2024년 합계처럼 각 지역의 10년 총합&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;axis=1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;로우 단위 집계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2015년 17개 시도 합계처럼 각 연도의 전국 인구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;연도별 전국 인구가 필요하므로 axis=1을 사용하였다. 강사는 코드 결과를 엑셀에서 별도로 합산하여 검증했다는 점을 언급하였다. 2015년 합계 51,529,338이 두 방식에서 일치하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;fig = px.line(pop_df,x='연도',y='전국인구',markers=True,title='대한민국 전체 인구 변화')
fig.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전국 인구는 2019년 약 5180만 명 , 정점을 찍은 뒤 감소로 전환하여 2024년 약 5121만 명이 되었다. 2020년 이후 감소 폭이 커지는 형태이며, 이는 출생 감소만이 아니라 사망을 포함한 순증감의 결과라는 점이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bheYka/dJMcacjGR7o/2PX6I6UMUtejLHikHyWrJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bheYka/dJMcacjGR7o/2PX6I6UMUtejLHikHyWrJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bheYka/dJMcacjGR7o/2PX6I6UMUtejLHikHyWrJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbheYka%2FdJMcacjGR7o%2F2PX6I6UMUtejLHikHyWrJ0%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;757&quot; height=&quot;507&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;09. 2015년 대비 2024년 지역별 인구 증감&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;09. 2015년 대비 2024년 지역별 인구 증감&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;시작 연도와 마지막 연도를 각각 추출하여 비교 테이블을 만드는 흐름이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1) 2015년 데이터 추출
pop_2015 = (
    pop_df.query(&quot;연도 == '2015년_총인구수'&quot;).drop(columns = ['연도','전국인구']).T.reset_index()
)

# 컬럼명 정리
pop_2015.columns = ['지역','2015년_총인구']
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;동일한 코드에서 연도만 바꾸어 pop_2024를 생성하였다. 각 단계의 역할은 다음과 같다.&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;query: 해당 연도 로우 한 줄만 추출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;drop(columns=['연도','전국인구']): 비교에 불필요한 컬럼 제거&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;.T: 지역이 세로로 나열되도록 전치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;.reset_index(): 인덱스를 일반 컬럼으로 내려 지역명을 컬럼으로 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;컬럼명 재지정: index, 0 같은 의미 없는 컬럼명은 결과 보고 시 설명이 불가능하므로 반드시 정리한다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전체 코드를 소괄호로 감싼 것은 메서드 체인을 여러 줄로 나누어 쓰기 위한 형식이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 3) 두 데이터 프레임 2015,2024년 데이터프레임 결합
pop_change = pd.merge(pop_2015, pop_2024, on='지역') #합칠 때 합칠 기준이 있어야함.

#4) 인구증감 계산하여 파생변수 만들기
pop_change = pop_change.assign(인구증감 = pop_change['2024년_총인구']-pop_change['2015년_총인구'])

# 5) 인구증감 순으로 정렬
pop_change = pop_change.sort_values(by='인구증감',ascending=False)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;pd.merge는 두 데이터프레임을 합치는 메서드이며 합칠 기준 컬럼을 on으로 지정해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정렬 결과 증가 지역은 6곳, 감소 지역은 11곳이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;지역 2015년 2024년 인구증감&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bapJox/dJMcajpvQrL/9ENv4o1MkhILNQziimea9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bapJox/dJMcajpvQrL/9ENv4o1MkhILNQziimea9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bapJox/dJMcajpvQrL/9ENv4o1MkhILNQziimea9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbapJox%2FdJMcajpvQrL%2F9ENv4o1MkhILNQziimea9k%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;1358&quot; height=&quot;666&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;fig = px.bar(
    pop_change,
    x='인구증감',
    y='지역',
    orientation='h',
    title='2015년 대비 2024년 지역별 인구 증감',
    text='인구증감',
    color='인구증감',
    color_continuous_scale='RdBu'
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;orientation='h'로 가로 방향을 지정하고, color_continuous_scale='RdBu'로 증감 부호에 따라 빨강과 파랑이 자동 배정되도록 하였다. add_vline(x=0, line_dash='dash')으로 0 기준선을 추가하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;증가한 지역이 수도권(경기&amp;middot;인천)과 세종 주변(세종&amp;middot;충남&amp;middot;충북)에 집중되어 있다는 점, 서울특별시가 -690,353명으로 최하위라는 점이 확인된다. 서울에서 경기&amp;middot;인천으로, 대전에서 세종&amp;middot;충남&amp;middot;충북으로 인구가 이동한 형태로 해석되었다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-heading=&quot;10. 전년 대비 증감, 증감률, 3년 이동평균&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;10. 전년 대비 증감, 증감률, 3년 이동평균&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;10년 단위 비교로 큰 흐름을 확인한 다음, 연도 단위로 좁혀 어느 시점부터 변화가 발생했는지 분석하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;pop_df = pop_df.assign(전년대비증감 = pop_df['전국인구'].diff())

pop_df = pop_df.assign(전년대비증감률 = pop_df['전국인구'].pct_change()*100)

pop_df = pop_df.assign(이동평균3년 = pop_df['전국인구'].rolling(3).mean())
&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;diff(): difference의 약자로 전년 대비 차이를 계산한다. 2015년은 비교 대상이 없어 NaN이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;pct_change(): 전년 대비 변화 비율을 소수로 반환하므로 100을 곱해 퍼센트로 변환한다. 실무 보고에서는 절대 수치보다 비율로 설명하는 경우가 많기 때문에 함께 확인한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;rolling(3).mean(): 3년 구간 이동평균이며 3년치가 모이는 2017년부터 값이 생성된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;연도 전국인구 전년대비증감 증감률(%) 이동평균3년&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbHWV2/dJMcahrSq6g/YyEmdQHfoM7YNkoOG2RDj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbHWV2/dJMcahrSq6g/YyEmdQHfoM7YNkoOG2RDj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbHWV2/dJMcahrSq6g/YyEmdQHfoM7YNkoOG2RDj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbHWV2%2FdJMcahrSq6g%2FYyEmdQHfoM7YNkoOG2RDj1%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;425&quot; height=&quot;526&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;증감 수치와 증감률은 서로 다른 사실을 보여준다. 절대 수치로는 2020년 이후 계속 감소 중이지만, 증감률로 보면 2022년 -0.387%를 저점으로 2023년 -0.221%, 2024년 -0.211%로 감소 폭 자체는 줄어들고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이동평균은 추세(Trend) 확인을 목적으로 사용한다. 이번 데이터는 연도별 변동이 크지 않아 원본과 이동평균의 차이가 크지 않지만, 주식 가격이나 일별 방문자 수처럼 단기 변동이 큰 데이터에서 유효하다. 주식 차트의 5일선, 20일선, 60일선이 모두 이동평균이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;</description>
      <category>MLOps엔지니어</category>
      <category>ABC부트캠프</category>
      <category>AI캠퍼스</category>
      <category>AI파일럿</category>
      <category>mlops</category>
      <category>고용노동부</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/40</guid>
      <comments>https://ideas9064.tistory.com/40#entry40comment</comments>
      <pubDate>Sun, 2 Aug 2026 20:52:34 +0900</pubDate>
    </item>
    <item>
      <title>ABC 부트캠프 AI파일럿 1기 MLOps 4일차_NumPy 배열 연산과 pandas 데이터 파악하기</title>
      <link>https://ideas9064.tistory.com/39</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;01. NmnPy 기본 이해&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;NumPy의 핵심 자료형은 &lt;code&gt;ndarray&lt;/code&gt;이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트와 달리 하나의 배열 안에는 같은 자료형만 담을 수 있다. 수치 연산에 특화된 자료구조이므로 자료형이 섞이면 연산이 성립하지 않기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;score_list = [80,90,100]
score_np = np.array(score_list)

print(type(score_list))
print(type(score_np))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;출력만으로도 두 자료구조를 구분할 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트는 원소 사이에 콤마가 표시되지만 ndarray는 콤마 없이 &lt;code&gt;[ 80 90 100]&lt;/code&gt; 형태로 출력된다. 다만 정확한 판별은 &lt;code&gt;type()&lt;/code&gt;으로 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;배열의 기본 속성은 소괄호 없이 호출한다. &lt;b&gt;소괄호가 붙으면&lt;/b&gt; 기능을 수행하는 함수&amp;middot;메서드이고, &lt;b&gt;붙지 않으면&lt;/b&gt; 객체가 고유하게 가진 속성(어트리뷰트)이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;score_np = np.array([80,90,100])
print('차원',score_np.ndim)
print('형태',score_np.shape)
print('원소 개수',score_np.size)
print('자료형',score_np.dtype)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;출력은 차원 1, 형태 &lt;code&gt;(3,)&lt;/code&gt;, 원소 개수 3, 자료형 &lt;code&gt;int64&lt;/code&gt;이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1차원 배열의 &lt;code&gt;shape&lt;/code&gt;은 뒷자리를 생략하므로 &lt;code&gt;(3,)&lt;/code&gt;으로 표기되며, 앞의 3은 데이터 개수를 의미한다.&lt;/span&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;배열 생성 함수는 네 가지를 다루었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;print(np.array([10,20,30,50])) # 리스트 값(특정 값)을 지정해서 배열 생성
print(np.zeros(5)) # 5개의 값을 0으로 채워서 생성
print(np.ones(5)) # 5개의 값을 1로 채워서 생성
print(np.arange(1,11)) # 범위 값을 채워서 생성 1부터 10까지 데이터를 만들어서 배열 생성&lt;/code&gt;&lt;/pre&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;함수&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;기능&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;array()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트 등 기존 값을 배열로 변환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;zeros()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;지정한 개수만큼 0으로 채운 배열 생성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;ones()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;지정한 개수만큼 1로 채운 배열 생성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;arange()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;zeros()&lt;/code&gt;와 &lt;code&gt;ones()&lt;/code&gt;가 생성하는 배열의 &lt;code&gt;dtype&lt;/code&gt;은 &lt;code&gt;float64&lt;/code&gt;이다. 실수형이 정수형을 포함하므로 초기값 배열은 기본적으로 실수형으로 만들어진다. 머신러닝 단계에서 학습 데이터의 초기 배열을 생성할 때 사용된다는 용도가 함께 설명되었다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;02. 리스트와 NumPy 연산 비교&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;동일한 &lt;code&gt;* 2&lt;/code&gt; 연산이 자료구조에 따라 다르게 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;score_list = [80,90,100]
score_np = np.array(score_list)

print('리스트 * 2:', score_list * 3) #리스트의 곱셈은 리스트가 가지고 있는 요소를 복사하기(문자열 곱셈과 동일)

print('NumPy배열 * 2: ',score_np * 2) # NumPy 배열의 곱셈은 각 요소에 곱셈 연산
print('NumPy배열 + 10: ',score_np + 10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트의 곱셈은 문자열 곱셈과 동일하게 요소를 복사하고, 덧셈은 두 리스트를 연결한다. 반면 NumPy 배열의 곱셈과 덧셈은 각 원소에 대한 연산으로 처리된다. 수십만 건 데이터에 일괄 연산을 적용해야 할 때 배열로 변환한 뒤 한 줄로 처리할 수 있다는 점이 차이의 실질적인 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;03. 서울 최고기온 분석&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;03-1. NumPy 배열로 변환&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;CSV를 읽는 단계에서는 리스트에 담고, 반복문이 끝난 뒤 배열로 변환한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;append()&lt;/code&gt;가 반복문 안에 있고 배열 변환은 반복문 밖에 있어야 한다는 들여쓰기 위치를 강조하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;date_list =[]
max_temp = []

with open(FILE_PATH, 'r', encoding='euc-kr') as f:
    data = csv.reader(f)
    header = next(data)
    for row in data:
        # 최고기온이 비어 있으면 해당 행을 건너뜁니다.
        if row[-1] == '':
            continue
        date_list.append(row[0])
        max_temp.append(float(row[-1]))

# 리스트를 NumPy 배열로 변환
dates = np.array(date_list)
max_temps = np.array(max_temp)

print('날짜 배열 형태:' , dates.shape)
print('최고기온 배열 형태:' , max_temps.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;결측치를 제외한 결과는 두 배열 모두 &lt;code&gt;(39462,)&lt;/code&gt;이다. 두 배열의 건수가 일치해야 같은 인덱스로 값을 대응시킬 수 있으므로 &lt;code&gt;shape&lt;/code&gt; 확인은 필수 절차에 해당한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;03-2. argmax()로 위치 찾기&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;max_index = np.argmax(max_temps) #변수명 지정할 때 위치를 가리키는 것하는 idex를 붙여서 하면 좋음.
max_index  # '39292' 위치값

print('서울의 최고기온이 가장 높았던 날:', dates[max_index])
print('서울의 최고기온:', max_temp[max_index])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;np.argmax()&lt;/code&gt;가 반환하는 값은 최댓값 자체가 아니라 최댓값이 저장된 위치(인덱스)이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;반환값은 39292이고, 이 인덱스를 &lt;code&gt;dates&lt;/code&gt;와 &lt;code&gt;max_temps&lt;/code&gt;에 각각 넣어 2018-08-01, 39.6℃를 얻는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;날짜 배열과 기온 배열이 같은 순서로 구성되어 있기 때문에 하나의 인덱스로 두 값을 동시에 조회할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;03-3. 기초 통계량&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;메서드&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;설명&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;mean()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;평균값을 계산&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;max()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;가장 큰 값을 반환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;min()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;가장 작은 값을 반환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;std()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;표준편차를 계산&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;print('평균 기온은 %.3f도' % max_temps.mean() )
print('가장 높은 최고 기온은 %.3f 도' % max_temps.max())
print('최저 기온은 %.3f 도' % max_temps.min())
print('기온의 표준편차: %.3f' % max_temps.std())&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;04. 조건에 맞는 기온 추출 (Boolean Indexing)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;비교 연산자를 배열에 적용하면 각 원소에 대한 True/False 배열이 생성되고, 이 배열을 인덱스로 사용하면 조건을 만족하는 값만 추출된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;hot_days = max_temps &amp;gt;= 37 #  조건에 만족하는 True, false 결과가 들어감. 비교연산자 사용으로 true 아니면 false로 값이 출력됨
hot_days[0:10]
type(hot_days)

print('37도 이상인 날짜: ', dates[hot_days])
print('38도 이상인 기온:', max_temps[hot_days])
print('37도 이상인 날의 수: ', np.sum(hot_days))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;시각화&lt;/b&gt;는&lt;b&gt; scatter 차트&lt;/b&gt;로 처리.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;i&gt;&lt;b&gt;matplotlib은 x축과 y축이 모두 수치형이어야 하므로, 문자열인 날짜를 그대로 넣을 수 없다.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;먼저 &lt;code&gt;np.arange()&lt;/code&gt;로 수치 인덱스를 만들어 차트를 그린 뒤 &lt;code&gt;xticks()&lt;/code&gt;로 축 라벨만 날짜 문자열로 교체하는 순서를 따른다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;# 1. 37도 이상의 날짜와 온도를 담을 변수(nparray)를 선언
hot_dates = dates[hot_days]
hot_temps = max_temps[hot_days]

x = np.arange(len(hot_dates))

# 2. 차트 시각화(scatter차트) plt 라이브러리는 x,y축은 모두 수치형
plt.figure(figsize =(15,5))

plt.scatter(x,hot_temps)
plt.xticks(x, hot_dates, rotation=-60) # x축의 값을 hot_dates의 값으로 교체하고 글씨의 방향을 90도 회전
plt.xlabel('날짜')
plt.ylabel('기온')
plt.title('서울의 최고 기온 기준 37도 이상 폭염일')
plt.grid(alpha=0.3) # 30% 투명도 x축과 y축의 경계를 그림.
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;05. 특정 연도 기온 시각화&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;NumPy는 수치 연산 외에 문자열 처리 함수도 &lt;code&gt;np.char&lt;/code&gt; 하위에 제공한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열 슬라이싱으로 인덱스를 하드코딩하는 대신 함수를 사용하면 코드 품질이 개선된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;year_2018 = np.char.startswith(dates,'2018') # 각 요소의 시작위치부터 2018로 시작하는 문자열 찾기 -&amp;gt; boolean indexing
temp_2018 = max_temps[year_2018] #2018 최고기온 데이터 추출
dates_2018 =dates[year_2018]     # 2018 날짜 데이터 추출

print('2018년도 날짜 데이터 수: ' , len(dates_2018))
print(dates_2018[0:5])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;np.char.startswith()&lt;/code&gt;의 반환값도 True/False 배열이므로 Boolean Indexing과 동일하게 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;06. ★ 리스트 컴프리헨션과 월별 기온 비교&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트 컴프리헨션은 반복문, 표현식 처리, &lt;code&gt;append()&lt;/code&gt;를 한 줄로 합치는 문법이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[표현식 for 변수 in 반복가능한객체]&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;result = []
for 변수 in 반복가능한객체:
    result.append(표현식)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;실습 문제(연도만 추출)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;year = [date[:4]for date in dates]
year&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;월 추출과 월별 비교&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;months = np.array([date[5:7] for date in dates])

print(months) # 전체 날짜에서 월만 추출한 ndarray

# boolean indexing을 통한 1월 8월 추출
jan_temp = max_temps[months == '01']
aug_temp = max_temps[months == '08']

print('1월의 평균 최고 기온: ', jan_temp.mean())
print('8월의 평균 최고 기온:', aug_temp.mean())
print('1월의 데이터 수: ', jan_temp.size)
print('8월의 데이터 수:', aug_temp.size)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트 컴프리헨션의 결과를 &lt;code&gt;np.array()&lt;/code&gt;로 감싸 ndarray로 만든 뒤 조건식을 대괄호에 직접 넣었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;분포 비교&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;plt.figure(figsize=(8,5))
plt.boxplot([jan_temp, aug_temp], labels =['1월','8월'])
plt.title('1월과 8월의 최고 기온 분포')
plt.xlabel('월')
plt.ylabel('최고 기온')
plt.grid(axis='y',alpha=0.3)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;--&lt;code&gt;grid(axis='y')&lt;/code&gt;로 격자를 y축 방향으로만 그려 기온 값을 읽기 쉽게 함.--&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;07. Pandas 데이터 파악할 때 사용하는 함수&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;오후 실습 데이터는 미국 환경청(EPA)의 자동차 연비 데이터셋(mpg)이다. 1999년부터 2008년까지 매년 출시된 인기 차량을 선별한 표준 예제 데이터셋이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;csv.reader()&lt;/code&gt;와 달리 &lt;code&gt;read_csv()&lt;/code&gt;는 첫 줄을 컬럼으로 자동 인식하고 두 번째 줄부터 데이터로 처리한다. 다만 컬럼 행이 없는 CSV는 첫 데이터 행이 컬럼으로 잡히는 문제가 발생하므로 원본 구조 확인이 선행되어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;데이터를 파악할 때 사용하는 함수&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;함수&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;기능&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;head()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;앞부분 출력&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;tail()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;뒷부분 출력&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;shape&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;행, 열 개수 출력&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;info()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;변수 속성 출력&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;describe()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&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;pre class=&quot;elixir&quot;&gt;&lt;code&gt;mpg.describe() # 수치형 컬럼들의 요약 통계량 제공
mpg.describe(include='all')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;describe()&lt;/code&gt;는 수치형 컬럼에 대해 count, mean, std, min, 25%, 50%, 75%, max를 한 번에 제공한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;컬럼 정보는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;08. 함수, 패키지 함수, 메서드, 어트리뷰트&lt;/span&gt;&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;구분&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;설명&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;사용 형태&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;예시&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;내장 함수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파이썬에서 기본으로 제공&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;함수(데이터)&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;print()&lt;/code&gt;, &lt;code&gt;len()&lt;/code&gt;, &lt;code&gt;type()&lt;/code&gt;, &lt;code&gt;sum()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;패키지 함수&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;라이브러리에서 제공&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;패키지.함수(데이터)&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;np.array()&lt;/code&gt;, &lt;code&gt;np.arange()&lt;/code&gt;, &lt;code&gt;np.argmax()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;메서드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;객체가 가지고 있는 기능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;객체.메서드()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;max_temps.mean()&lt;/code&gt;, &lt;code&gt;mpg.head()&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;어트리뷰트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;객체가 가진 고유 속성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;객체.속성&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;mpg.shape&lt;/code&gt;, &lt;code&gt;score_np.dtype&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1) 내장함수 : import 하지 않고 사용 할 수 있는 함수
sum(mpg['year'])

# 2) 패키지 함수 : import 해서 패키지명과 같이 호출하는 함수
pd.read_csv('/content/mpg.csv')

# 3) 메서드 : 객체를 통해서 (내가 생성한 변수명) 사용할 수 있는 기능
mpg.head()

#) 어트리뷰트 : 객체(or 변수)가 가지고 있는 고유한 속성
mpg.shape&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;별 기준은 앞에 무엇이 붙는지이다. 아무것도 붙지 않으면 내장 함수, 패키지 별칭이 붙으면 패키지 함수, 직접 선언한 변수명이 붙으면 메서드이다. 소괄호 유무로 메서드와 어트리뷰트를 구분한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;09. 컬럼명 바꾸기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전처리 전에 원본을 복사해 두는 절차가 선행된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;df_mpg = pd.read_csv('/content/mpg.csv')
df_new = df_mpg.copy() #원본 데이터 보존이 핵심
df_new = df_new.rename(columns = {'manufacturer':'manufact'}) # {기존컬럼명 : 바꿀컬럼명}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;rename()&lt;/code&gt;은 원본을 직접 수정하지 않고 변경된 결과를 반환하므로 다시 변수에 담아야 적용된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;인자는 &lt;code&gt;{기존컬럼명: 바꿀컬럼명}&lt;/code&gt; 형태의 딕셔너리이며, 콤마로 이어 여러 컬럼을 한 번에 변경할 수 있다.&lt;/span&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;변수명 규칙도 함께 제시되었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;DataFrame 자료구조를 담는 변수에는 &lt;code&gt;df_mpg&lt;/code&gt;, &lt;code&gt;mpg_df&lt;/code&gt;처럼 &lt;code&gt;df&lt;/code&gt;를 붙여 자료구조를 명시하는 것이 코드 리뷰 관례이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;10. 파생 변수 만들기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;수집이 끝난 데이터에 필요한 항목이 없을 때, 기존 컬럼을 계산해 새 컬럼을 만드는 것을 파생변수라고 한다. 머신러닝 단계에서 학습 성능을 높이기 위해 자주 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;10-1. 계산식으로 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;# 통합 연비 계산 - (도시 연비 + 고속도로 연비 ) / 2
df_mpg['total'] = (df_mpg['cty'] + df_mpg['hwy']) / 2

df_mpg.head()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;DataFrame의 컬럼 접근은 딕셔너리와 동일한 구조이다. 해당 컬럼명이 없으면 새로 생성되고, 있으면 값이 대체된다. 반복문 없이 234개 행 전체에 계산이 일괄 적용된다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;10-2. 조건식으로 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;기준값은 임의로 정하지 않고 근거를 제시해야 한다. &lt;code&gt;describe()&lt;/code&gt;로 &lt;code&gt;total&lt;/code&gt;의 평균이 20.149573임을 확인하고, 히스토그램으로 분포가 정규분포에 가까운 형태임을 확인한 뒤 20을 기준으로 정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;df_mpg['total'].describe() #요약 통계량&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;# 그래프로 표현
df_mpg['total'].plot.hist();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;matplotlib을 임포트하지 않아도 pandas 자체 차트 기능으로 히스토그램을 그릴 수 있다. 코드 끝의 세미콜론은 축 객체가 출력되는 것을 막기 위한 표기이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;import numpy as np

#total 값이 20 이상이면 pass, 20이하면 fail 부여
df_mpg['test'] = np.where(df_mpg['total'] &amp;gt;= 20, 'pass','fail'); #np.where(조건, 만족하면 처리, 만족하지 않을 경우 처리)
df_mpg.head()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;np.where(조건, 참일 때 값, 거짓일 때 값)&lt;/code&gt;은 if-else 구조를 함수 하나로 대체하며, 234건 전체를 한 번에 처리한다는 점이 핵심이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;11. 빈도표와 비율 시각화&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;df_mpg['test'].value_counts()&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;결과는 pass 128건, fail 106건.

```python
df_mpg['test'].value_counts().plot.bar(rot = 0); #rot =o 축 이름을 수평으로 만듬&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;rot&lt;/code&gt;은 rotation의 약자이며 막대 차트의 x축 라벨 기본 각도가 90도이므로 0으로 지정해 수평으로 바꾼다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;xl&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
df_mpg['test'].value_counts().plot.pie(autopct='%.3f%%');
plt.title('pass and fail')
plt.show&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;막대 차트는 절대 수치 비교, 파이 차트는 비율 비교를 담당한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;128건과 106건의 차이가 전체에서 몇 퍼센트를 차지하는지는 절대값만으로는 판단하기 어려우므로 두 차트를 함께 제시한다는 관점이 설명되었다. &lt;code&gt;autopct&lt;/code&gt;는 파이 차트에 표시할 비율의 소수점 자릿수를 지정한다. &lt;code&gt;koreanize-matplotlib&lt;/code&gt;을 설치하지 않은 노트북이므로 제목은 영문으로 작성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;12. 데이터 전처리 개요와 query()&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;pandas의 데이터 가공 메서드는 다음과 같이 정리되었다.&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;메서드&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;기능&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;query()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;행 추출&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;df[]&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;열(변수) 추출&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;sort_values()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정렬&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;groupby()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;집단별로 나누기&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;agg()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;통계치 구하기&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;merge()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터 합치기(열)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;concat()&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;조건 추출에 앞서 대상 컬럼의 구성을 확인한다. 중복을 제거한 값의 종류는 &lt;code&gt;unique()&lt;/code&gt;로 조회한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;# category(차종)의 종류가 어떻게 구성되어 있는지 확인(중복제거 한 데이터 종류) -&amp;gt; category 컬럼 확인
df_mpg['category'].unique()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;결과는 compact, midsize, suv, 2seater, minivan, pickup, subcompact의 7종이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;df_mpg.query(&quot;category == '2seater'&quot;) # 여기선 [&quot;&quot;]을 넣어야됨&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;query()&lt;/code&gt;의 조건식은 문자열로 전달한다. 조건식 내부에서 문자열 값을 비교할 때 작은따옴표를 쓰므로, 바깥쪽은 큰따옴표로 감싸야 한다. 추출 결과는 5건이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;scilab&quot;&gt;&lt;code&gt;df_mpg.query(&quot;category != 'minivan'&quot;)
df_mpg.query(&quot;year &amp;gt; 2005&quot;)
df_mpg.query(&quot;category == 'minivan' &amp;amp; year &amp;gt;=2000&quot;)
df_mpg.query(&quot;category == 'minivan' |category == 'pickup' | category == '2seater'&quot;)
df_mpg.query(&quot;category in ['minivan','pickup','2seater']&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;minivan은 11건이므로 부정 조건의 결과는 223건이고, &lt;code&gt;year &amp;gt; 2005&lt;/code&gt; 조건은 117건이다. 논리 연산자는 텍스트 &lt;code&gt;and&lt;/code&gt;가 아니라 기호 &lt;code&gt;&amp;amp;&lt;/code&gt;와 &lt;code&gt;|&lt;/code&gt;를 사용한다. 마지막 두 줄은 동일한 결과를 반환하며, 세 가지 이상의 값을 비교할 때는 &lt;code&gt;in&lt;/code&gt; 연산자로 리스트를 전달하는 편이 간결하다. &lt;code&gt;query()&lt;/code&gt;의 조건식 문법이 SQL의 WHERE 절과 거의 동일하므로 데이터베이스 연동 단계에서 그대로 재사용할 수 있다는 점이 언급되었다&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;15. 필요한 변수만 추출하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;대괄호 개수에 따라 반환되는 자료구조가 달라진다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# 하나의 컬럼으로 구성되어 있으면 Series 자료 구조로 추출(1차원 배열)
type(df_mpg['category'])
type(df_mpg[['category']])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;df_mpg['category']&lt;/code&gt;는 Series, &lt;code&gt;df_mpg[['category']]&lt;/code&gt;는 DataFrame을 반환한다. Series는 컬럼명을 가진 1차원 배열에 해당하며, 화면 출력만으로는 두 구조를 구분하기 어렵다. 머신러닝 단계에서 컬럼 하나를 NumPy 배열로 변환할 때는 Series 형태가 사용되고, DataFrame 간 결합을 위해 형태를 유지해야 할 때는 대괄호를 두 번 감싼다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# 여러개의 컬럼을 한번에 추출
df_mpg[['year','model','category']]&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;여러 컬럼을 동시에 추출할 때도 대괄호를 두 겹으로 사용한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>MLOps엔지니어</category>
      <category>ABC부트캠프</category>
      <category>AI캠퍼스</category>
      <category>AI파일럿</category>
      <category>mlops</category>
      <category>고용노동부</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/39</guid>
      <comments>https://ideas9064.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 2 Aug 2026 14:28:59 +0900</pubDate>
    </item>
    <item>
      <title>ABC 부트캠프 AI파일럿 1기 MLOps 3일차_서울 기온 CSV 데이터 분석과 matplotlib 시각화</title>
      <link>https://ideas9064.tistory.com/38</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;01. 무한 반복 영어 단어 퀴즈 while문으로&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;어제 한 for문의 영어퀴즈에 이어서 오늘은 while 문을 통해 영어 퀴즈를 만드는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이번 목표는 &quot;stop&quot;을 입력할 때까지 무한히 문제가 나오고, 매번 어떤 단어가 나올지 예측할 수 없도록 랜덤하게 출제되도록 만드는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;import random

# 영어 단어 퀴즈가 무한 반복으로 진행되고, 사용자가 stop 키워드를 입력해야지만 퀴즈가 종료되게 설계

words = {'꽃':'flower',&quot;나비&quot;:'butterfly','학교':'school','자동차':'car'}

#딕셔너리의 키들만 따로 저장 (퀴즈 문제로 사용)
words_keys = list(words.keys())

print('***영어 단어 맞추기 퀴즈 시작***')

while True:
  key = random.choice(words_keys) #random.choice
  input_word = input('%s에 해당되는 영어 단어를 입력하세요' % key)

  if input_word == 'stop':
    print('퀴즈를 종료합니다.')
    break
  elif input_word == words[key]:
      print('정답입니다.')
  else:
    print('오답입니다.')


print('***영어 단어 맞취기 퀴즈 끝***')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;1) 딕셔너리에서 키 리스트를 확보.&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;딕셔너리 리스트와 달리 순서를 보장하지 않기 때문에 인덱스로 키를 꺼내 쓸 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;대신 딕셔너리가 제공하는 &lt;b&gt;key() 메서드&lt;/b&gt;로 뷰 객체를 받은 뒤 list()로 감싸서 리스트로 변환 하여야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;2) 무한 반복문과 random.choice&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;먼저 random은 파이썬 표준 라이브러리에 포함되지 않아. &lt;b&gt;import random&lt;/b&gt;이 필요하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;random.choice()&lt;/b&gt;은 인자로 받은 시퀀스에서 하나의 요소를 무작위로 반환한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;while True 는 조건 없이 진입 하는 무한 루프로서 종료 조건이 필요하다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;'stop'을 입력 받으면 &lt;b&gt;break&lt;/b&gt;로 탈줄한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;02. csv 파일에 대한 이해와 NOtePad++ 편집기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;1) CSV가 데이터 분석의 기본 포맷인 이유&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;CSV(Comma Separated Values)는 쉼표(&lt;code&gt;,&lt;/code&gt;)로 필드를 구분한 순수 텍스트 파일이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;셀 파일과 대비되는 세 가지 장점&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;(1) 엑셀 파일은 별도의 소프트웨어(유료)가 설치되어야 열리지만 CSV는 메모장으로도 열린다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;(2) 엑셀은 대략 1만 행을 넘어가면 열기 자체가 어려워지지만 CSV는 대용량에서도 안정적이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;(3) 학습 데이터셋과 공공 데이터는 대부분 CSV 형식으로 배포된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;우리나라 공공 데이터 포털과 기상자료개방포털도 기본으로 CSV를 제공하며, 편의를 위해 XLSX도 병행 배포하는 경우가 많다. 다만 데이터 원본 이해라는 관점에서는 CSV를 다루는 능력이 더 근본적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;2) 인코딩과 한글 깨짐 이슈&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;CSV 파일의 가장 큰 함정은 인코딩이다. 파이썬의 기본 인코딩은 UTF-8이지만, 국내 공공기관이 배포하는 CSV는 대부분 EUC-KR로 저장되어 있다. UTF-8은 한글 한 글자를 3바이트로 표현하는 유니코드 기반 인코딩이고, EUC-KR은 한국어에 특화된 완성형 인코딩이다. 인코딩이 어긋나면 파일을 열 때 한글이 깨지거나 아예 오류가 발생한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;3) Notepad++로 원본 확인하기&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;원본 데이터는 무엇보다 눈으로 먼저 확인해야 한다는 것이 교수님께서 여러 번 강조하였다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;원본 데이터를 볼 때 확인 해야 할 포인트&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파일의 총 행 수를 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;화면 하단에 표시된 인코딩을 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;컬럼 구분자가 실제로 쉼표인지, 앞뒤에 불필요한 공백이나 탭이 섞여 있지 않은지 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;위에 사항을 잘 확인하고 삭제한 뒤 저장할 필요가 있다. csv.reader로 스캔할 때 헤더 위에 잔여 텍스트가 있으면 파싱이 어긋날 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;4) 서울 데이터셋의 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brA24S/dJMcahk7eqC/YpFTQsaiOfYmFNhqDhEhq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brA24S/dJMcahk7eqC/YpFTQsaiOfYmFNhqDhEhq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brA24S/dJMcahk7eqC/YpFTQsaiOfYmFNhqDhEhq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrA24S%2FdJMcahk7eqC%2FYpFTQsaiOfYmFNhqDhEhq1%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;516&quot; height=&quot;278&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;03. csv 읽기&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import csv

# 1) 파일을 연다.
f = open('/content/seoul (1).csv', 'r', encoding='euc-kr')

# 2) 파일을 읽는다.
data = csv.reader(f, delimiter=',')
print(data)

# 3) 파일 내용을 출력
for row in data:
    print(row)

# 4) 파일 닫기
f.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;1) 파일은 &lt;code&gt;f = open('/content/seoul (1).csv', 'r', encoding='euc-kr')&lt;/code&gt;이와 같은 방식으로 열어서 확인할 수 있다&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;2) csv.reader(f, delimiter=',')&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;csv.reader&lt;/code&gt;에 전달하면 행 단위로 순회 가능한 이터레이터 객체가 만들어진다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;csv.reader&lt;/code&gt;의 &lt;code&gt;delimiter=','&lt;/code&gt;는 구분자를 명시하는 옵션이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;for row in data&lt;/code&gt;로 순회한 결과, 각 행은 리스트로 반환되었다&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;예시&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;주목할 점은 작은 따옴표로 감싸진 문자열이다. csv.reader는 파일의 값을 자동으로 형변환하지 않는 것을 알 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;마지막엔 f.close() 파일을 닫아준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;['1907-10-01', '108', '13.5', '7.9', '20.7']&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;04. 헤더 저장&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;1) &lt;code&gt;next( )&lt;/code&gt;로 헤더 한 줄 분리&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;next(iterator)&lt;/code&gt;는 이터레이터에서 다음 요소 하나를 꺼내고 커서를 그다음 위치로 이동시키는 내장 함수이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;# 헤더 저장 - next()가 한 줄 읽고 커서를 다음으로 넘김
header = next(data)

f.close()
print(header)&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;출력은 &lt;code&gt;['날짜', '지점', '평균기온(℃)', '최저기온(℃)', '최고기온(℃)']&lt;/code&gt;이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;next()&lt;/code&gt;는 어제 배운 리스트의 &lt;code&gt;pop()&lt;/code&gt;과 유사한 감각으로 이해할 수 있다. &lt;code&gt;pop&lt;/code&gt;이 원본 리스트에서 요소를 잘라내는 반면 &lt;code&gt;next&lt;/code&gt;는 원본을 그대로 두면서 커서만 앞으로 이동시킨다는 점이 다르다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;i&gt;2) 헤더 분리 없이 데이터 처리를 시도하면 어떻게 될까?*&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;만약 헤더를 분리하지 않고 곧바로 최고 기온을 &lt;code&gt;float(row[4])&lt;/code&gt;로 형변환하면 첫 번째 반복에서 &lt;code&gt;'최고기온(℃)'&lt;/code&gt; 문자열을 실수로 바꾸려다 ValueError&lt;code&gt;가 발생한다. 원본을 훼손하지 않으면서 컬럼명 라인만 건너뛰는 정석 방법이&lt;/code&gt;next()`이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;05. 기온 출력과 결측치 처리&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;1) 결측치 처리에 대한 전략&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전략1. 극단값 대체&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;for row in data: if row[4] == '': # 결측치 확인 print(row[0]) # 결측치가 발생한 날짜 확인 row[4] = -999 # 극단값 대체 print(row[0], float(row[-1]))&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;절략2. &lt;code&gt;continue&lt;/code&gt;로 건너뛰기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;# 날짜와 최저기온 출력 for row in data: if row[3] == '': continue print(row[0], float(row[3]))&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;# 날짜와 평균기온 출력 for row in data: if row[2] == '': continue # 결측치면 다음 반복으로 print(row[0], float(row[2]))&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;06. matplotlib 기본 그래프&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;라이브러리리 임포트와 별칭&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;시각화의 사실상 표준 라이브러리는 &lt;code&gt;matplotlib&lt;/code&gt;이며, 그중 &lt;code&gt;pyplot&lt;/code&gt; 서브패키지가 상태 기반의 간편 API를 제공한다. 관례상 &lt;code&gt;plt&lt;/code&gt;라는 별칭을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;y값만 준 &lt;code&gt;plot()&lt;/code&gt; 호출&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;plt.plot(y)&lt;/code&gt;처럼 리스트 하나만 인자로 넘기면 그 리스트를 y값으로 인식하고 x값은 0부터 자동으로 1씩 증가시키며 선을 그린다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

plt.plot([20, 10, 50, 10, 30])  # y값만 주면 x는 자동으로 0부터 1씩 증가
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;y값만 준 plot() 호출&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;x와 y를 명시적으로 지정하려면 두 개의 리스트를 순서대로 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

plt.plot([100, 200, 300, 400, 500], [10, 20, 30, 40, 50])  # x, y 순서
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;타이틀 속성 추가&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;차트에는 반드시 타이틀을 부여한다는 원칙이 있다. 타이틀&amp;middot;x축 라벨&amp;middot;y축 라벨&amp;middot;범례가 없는 차트는 정보 전달에 실패한 차트이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;plt.title('plotting')
plt.plot([100, 200, 300, 400, 500], [10, 20, 30, 40, 50])
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qcCr3/dJMcagsS6jp/PGiU0lXB4hWqN3Tdxw6S6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qcCr3/dJMcagsS6jp/PGiU0lXB4hWqN3Tdxw6S6k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;427&quot; data-origin-width=&quot;627&quot; style=&quot;width: 35.201%; margin-right: 10px;&quot; data-widthpercent=&quot;36.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qcCr3/dJMcagsS6jp/PGiU0lXB4hWqN3Tdxw6S6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqcCr3%2FdJMcagsS6jp%2FPGiU0lXB4hWqN3Tdxw6S6k%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;627&quot; height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btIxs4/dJMcafnhNtn/1sUHBZ8F21S0JnW3so03KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btIxs4/dJMcafnhNtn/1sUHBZ8F21S0JnW3so03KK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;406&quot; data-origin-width=&quot;551&quot; style=&quot;width: 32.5343%; margin-right: 10px;&quot; data-widthpercent=&quot;33.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btIxs4/dJMcafnhNtn/1sUHBZ8F21S0JnW3so03KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtIxs4%2FdJMcafnhNtn%2F1sUHBZ8F21S0JnW3so03KK%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;551&quot; height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kavoa/dJMcabkTcUf/gdPv6VXbt1ckx2ii5yPF9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kavoa/dJMcabkTcUf/gdPv6VXbt1ckx2ii5yPF9K/img.png&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;450&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;30.65&quot; style=&quot;width: 29.9391%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kavoa/dJMcabkTcUf/gdPv6VXbt1ckx2ii5yPF9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKavoa%2FdJMcabkTcUf%2FgdPv6VXbt1ckx2ii5yPF9K%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;562&quot; height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;타이틀 속성 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;07. 서울 기온 데이터 시각화&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;import csv
import matplotlib.pyplot as plt

# 1) 파일을 연다.
f = open('/content/seoul (1).csv', 'r', encoding='euc-kr')

# 2) 파일을 읽는다.
data = csv.reader(f, delimiter=',')

# 3) 헤더 저장
header = next(data)

# 4) 최고 기온을 담을 리스트 변수 선언
result = []

# 5) 결측치를 제외한 최고 기온 데이터만 result 리스트에 담기
for row in data:
    if row[4] != '':
        result.append(float(row[-1]))

# 6) 파일 닫기
f.close()

# 7) 차트 그리기
plt.title('seoul')
plt.plot(result, 'r')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E0Yl4/dJMcagzDZxo/z6vKOhIWlU8xfJok3jB9AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E0Yl4/dJMcagzDZxo/z6vKOhIWlU8xfJok3jB9AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E0Yl4/dJMcagzDZxo/z6vKOhIWlU8xfJok3jB9AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE0Yl4%2FdJMcagzDZxo%2Fz6vKOhIWlU8xfJok3jB9AK%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;216&quot; height=&quot;164&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;08. 한글 깨짐 해결 - koreanize-matplotlib&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;matplotlib은 기본 폰트로 한글을 지원하지 않는다. plt.title('서울 최고 기온')을 그대로 실행하면 한글이 네모 박스(□□□)로 표시된다. Google Colab 환경에는 한글 폰트가 설치되어 있지 않기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;koreanize-matplotlib 설치와 임포트&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;가장 간편한 해결책은 koreanize-matplotlib 패키지를 설치하고 임포트하는 것이다. pip 명령어로 설치할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;!pip install koreanize-matplotlib&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;09. 문자열 슬라이싱으로 월별 데이터 추출&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1) 날짜 문자열의 구조&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;날짜 컬럼은 YYYY-MM-DD 포맷의 문자열이다. 예를 들어 '1907-10-01'은 10자리 문자열이며 각 위치는 다음과 같이 대응된다.&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;인덱스&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;0&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;5&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;7&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;8&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;9&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;9&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;7&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;-&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;-&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파이썬 문자열 슬라이싱 &lt;code&gt;s[start:end]&lt;/code&gt;는 &lt;code&gt;start&lt;/code&gt; 이상 &lt;code&gt;end&lt;/code&gt; 미만 구간을 반환한다. 이 성질을 이용해 연도, 월, 일을 각각 추출할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;date = '1907-10-01'
print(date[0:4])   # '1907' - 연도
print(date[5:7])   # '10'   - 월
print(date[8:])    # '01'   - 일&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;10. 팀 프로젝트&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;한국의 철베리아라고 불리는 철원의 여름철 기온 변화보면서 지구온난화의 영향이 얼마나 유의미하게 나타나는지 알아보았다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import csv
import matplotlib.pyplot as plt
import koreanize_matplotlib

f = open('/content/Cheorwon.csv', 'r', encoding='euc-kr')
data = csv.reader(f, delimiter=',')
header = next(data)

# 연도별 7월-8월 평균 기온을 저장할 딕셔너리
yearly_jul_aug_temps = {}

for row in data:
    try:
        date_str = row[0]
        year = int(date_str[0:4])
        month = int(date_str[5:7])
        avg_temp = float(row[2])

        if month in [7, 8]:
            if year not in yearly_jul_aug_temps:
                yearly_jul_aug_temps[year] = []
            yearly_jul_aug_temps[year].append(avg_temp)
    except (ValueError, IndexError):
        continue

f.close()

# 각 연도별 7-8월 평균 기온 계산
years = sorted(yearly_jul_aug_temps.keys())
avg_summer_temps = [sum(yearly_jul_aug_temps[year]) / len(yearly_jul_aug_temps[year])
                    for year in years if len(yearly_jul_aug_temps[year]) &amp;gt; 0]

filtered_years = [year for year in years if len(yearly_jul_aug_temps[year]) &amp;gt; 0]

plt.figure(figsize=(14, 7))
plt.plot(filtered_years, avg_summer_temps, marker='o',
         linestyle='-', color='blue', markersize=4)
plt.title('철원 7-8월 평균 기온 변화 (1907-현재)', fontsize=16)
plt.xlabel('년도', fontsize=12)
plt.ylabel('평균 기온 (℃)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks(filtered_years, rotation=45, ha='right', fontsize=10)
plt.yticks(fontsize=10)
plt.tight_layout()
plt.show()

print(f&quot;데이터 범위: {min(filtered_years)}년부터 {max(filtered_years)}년까지&quot;)&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 floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3G0x/dJMcafU6Lt9/7UK7qeBElkaoCEocMy7RF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3G0x/dJMcafU6Lt9/7UK7qeBElkaoCEocMy7RF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3G0x/dJMcafU6Lt9/7UK7qeBElkaoCEocMy7RF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3G0x%2FdJMcafU6Lt9%2F7UK7qeBElkaoCEocMy7RF1%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;463&quot; height=&quot;229&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;s&gt;코드는 claude의 도움을 살짝 받긴 했다.&lt;/s&gt;&lt;/span&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;지구온난화가 본격적으로 시작하기 시점인 20세기 후반 21세기 초 상승하는 시점과 철원의 7~8월의 평균 기온도 엇비슷하게 상승하고 있다는 것을 볼 수 있다.&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MLOps엔지니어</category>
      <category>ABC부트캠프</category>
      <category>AI캠퍼스</category>
      <category>AI파일럿</category>
      <category>mlops</category>
      <category>고용노동부</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/38</guid>
      <comments>https://ideas9064.tistory.com/38#entry38comment</comments>
      <pubDate>Sat, 1 Aug 2026 15:09:45 +0900</pubDate>
    </item>
    <item>
      <title>ABC 부트캠프 AI파일럿 1기 MLOps 2일차_ 데이터 분석을 위한 파이썬 기초</title>
      <link>https://ideas9064.tistory.com/37</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;테크노트 &amp;mdash; 2026.07.24 (금)&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;주제&lt;/b&gt;: 데이터 분석을 위한 파이썬 기초 (Day 1)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;커버리지&lt;/b&gt;: 데이터 분석 개요 &amp;middot; 파이썬 개발환경 &amp;middot; 기본 문법 &amp;middot; 조건문 &amp;middot; 반복문 &amp;middot; 자료구조&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;오늘의 학습 요약&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;부트캠프 첫 파이썬 세션. 데이터 분석의 큰 그림(왜 필요한가 &amp;rarr; 어디서 데이터를 구하나 &amp;rarr; 어떻게 보여주나)부터 시작해서, 실습 도구인 Google Colab 세팅, 그리고 파이썬 문법(변수&amp;middot;연산&amp;middot;문자열&amp;middot;조건문&amp;middot;반복문&amp;middot;자료구조)까지 하루에 훑었다. 4학년까지 파이썬을 몇 번 접해봤지만 대부분 프로젝트에서 AI가 짜준 코드를 붙여쓰는 수준이었어서, 오늘처럼 문법을 밑바닥부터 손으로 치는 시간이 오히려 필요했다. 특히 자료구조 세 종류(리스트/튜플/딕셔너리)의 사용 목적이 다르다는 게 이번에 명확해졌다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1. 왜 데이터 분석이 필요한가?&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1.1 데이터 분석이란&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;여러 가지 형태의 데이터에서 유용한 정보를 발굴해 &lt;b&gt;가치(Value)와 통찰력(Insight)&lt;/b&gt;을 창출해내는 일련의 과정이다. 강사님이 정의한 방식은 &quot;여러 데이터 &amp;rarr; 정보 추출 &amp;rarr; 가치 창출&quot;의 3단계의 흐름이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1.2 데이터 종류&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;비정형 데이터&lt;/b&gt;: 웹페이지, 블로그, 전자저널, 이메일 등 전자문서로 된 텍스트 자료. 정리되지 않은 형태.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;정형 데이터&lt;/b&gt;: 대규모 DB에 축적된 상품거래, 서비스 거래, 전자우편 송수신 기록 등. 이미 정리된 형태.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;초기 데이터 분석은 정형 위주였지만, 최근에는 SNS/텍스트 같은 비정형을 어떻게 수집&amp;middot;정리해서 가치를 뽑아내느냐가 중요해졌다. 분석의 첫 스텝은 &quot;내가 다루는 데이터가 정형인지 비정형인지&quot; 판단하는 것 &amp;mdash; 처리 방법이 완전히 다르기 때문.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1.3 데이터 수집 &amp;mdash; 어디서 구할까?&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;① 공공데이터포털 (data.go.kr)&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;행정안전부에서 운영하는 공공데이터 통합제공 시스템&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;국내에서 수집되는 거의 모든 공공데이터를 무료 개방&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;파일데이터(CSV), 오픈 API, 시각화&lt;/b&gt; 세 가지 방식으로 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;신뢰도가 높음 (국가 소속 데이터)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;CCTV 좌표까지 공개될 정도로 개방 수준이 높다. 잘못된 데이터셋에 대해 오류 신고도 가능.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;② Kaggle (kaggle.com)&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전 세계 데이터 과학자들이 데이터를 분석할 수 있도록 대회를 개최하고, 분석 내용을 토론할 수 있는 커뮤니티 플랫폼&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터셋 + 파이썬/R 개발환경 + 초보 강의를 함께 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;다른 사람의 분석 코드를 볼 수 있다는 것&lt;/b&gt;이 학습용으로 가장 큰 장점&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;다만 신뢰도는 케이스마다 다름. 공모전 제출용이나 신뢰도가 중요한 프로젝트에는 부적합, 참고용/레퍼런스용으로 활용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;③ AI Hub (aihub.or.kr)&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;한국지능정보사회진흥원이 운영하는 AI 통합 플랫폼&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;국내에서 예산 들여 수집한 &lt;b&gt;양질의 대용량 학습 데이터&lt;/b&gt;를 무료로 개방&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이미지&amp;middot;비디오&amp;middot;텍스트&amp;middot;오디오&amp;middot;3D&amp;middot;센서 등 유형별로 정리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;분야별로 비전&amp;middot;음성/자연어&amp;middot;교육&amp;middot;국토환경&amp;middot;농축수산&amp;middot;안전&amp;middot;자율주행&amp;middot;헬스케어 등&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;용량이 커서(TB 단위) 샘플 데이터부터 확인하고 본 파일 받는 흐름 권장&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;④ Web Crawling&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;위 세 소스에도 원하는 데이터가 없을 때는 직접 수집. 웹 페이지를 그대로 가져와서 데이터를 추출해내는 행위(crawl: 기어가다).&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;자주 쓰이는 라이브러리&lt;/b&gt;: Selenium, BeautifulSoup, requests&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;⚠️ &lt;b&gt;저작권 이슈&lt;/b&gt;가 핵심이다. 학습 목적이면 괜찮지만 공모전이나 서비스에 쓰려면 저작권 걸린 데이터는 피해야 함. AI로 크롤링 코드 짜기가 쉬워진 만큼 오히려 저작권 체크가 더 중요하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;자체 수집이 포함된 프로젝트는 포트폴리오/공모전에서 가치가 높게 평가된다. (공수가 큰 만큼)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;URL이란?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;크롤링 얘기하면서 짚고 넘어간 개념. &lt;b&gt;Uniform Resource Locator&lt;/b&gt;의 약자. 인터넷에 접속할 때, 네트워크 상에서 필요한 정보나 자원이 어디 있는지를 알려주는 문자열 = &quot;사이트의 집주소&quot;. 예: &lt;code&gt;https://www.google.com/&lt;/code&gt;, &lt;code&gt;https://www.data.go.kr/&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1.4 데이터 시각화&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터 분석 결과를 쉽게 이해할 수 있도록 &lt;b&gt;시각적 수단(그래프, 차트)&lt;/b&gt;을 통해 정보를 효과적으로 전달하는 것. 강사님 표현으로는 &quot;장문의 보고서 대신 카드 한 장으로 설명이 되게 만드는 것&quot;. 어떤 차트를 쓸지 고민하는 것 자체가 분석가의 역량이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;12가지 대표 시각화 종류&lt;/b&gt; (수업에서 소개된 표):&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;카테고리&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;종류&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;값 비교&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;막대 그래프(Bar), 원 그래프(Pie), 방사형 그래프(Rader)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;위치/공간&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터 맵(Data Map)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;추세&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;선 그래프(Line), 면적 그래프(Area)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;관계&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;산점도(Scatter Plot), 버블 차트(Bubble)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;텍스트/빈도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;워드클라우드(Wordcloud)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;강도/밀도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;열지도(Heatmap)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;일정/흐름&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;간트 차트(Gantt), 깔때기 도표(Funnel Plot)&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터 소스 부분은 그동안 프로젝트할 때마다 &quot;데이터 어디서 구하지&quot;부터 막혔던 기억이 있는데, 오늘 정리된 세 사이트만으로도 진입 장벽이 확 낮아질 것 같다. 특히 AI Hub는 처음 알았는데 MLOps 방향으로 갈 거면 학습 데이터 이슈가 계속 붙을 테니 즐겨찾기 필수다. 시각화 종류가 이렇게 많은 것도 몰랐는데, 앞으로 데이터 성격에 맞는 차트를 골라 쓰는 감각을 키워야 할 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2. 데이터 분석을 위한 파이썬 기초&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2.1 파이썬이란&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;사람과 컴퓨터 사이의 &quot;통역관&quot; 역할을 하는 프로그래밍 언어. 컴퓨터는 0과 1로만 통신하므로, 사람이 &quot;막대그래프 그려줘&quot;라고 요청하려면 중간에 서로 이해할 수 있는 언어가 필요한데 그게 파이썬. 자바보다 훨씬 오래된 언어지만 최근에야 급부상 &amp;mdash; &lt;b&gt;데이터 분석에 특화된 라이브러리 생태계&lt;/b&gt;가 결정적이었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2.2 데이터 분석 3대 라이브러리&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;Pandas&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;panel datas&lt;/code&gt;의 약자&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파이썬 데이터 분석에서 가장 많이 활용되는 라이브러리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터를 &lt;b&gt;쉽고 직관적으로&lt;/b&gt; 작업할 수 있음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;할 수 있는 것&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;Python 자료구조와의 호환 (List, Tuple, Dictionary, NumpyArray 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;큰 데이터를 빠르게 자르고 정렬&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터 통계 및 시각화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;외부 데이터(CSV, txt, 엑셀, SQL, XML 등)를 입력받아 자료구조로 저장 및 출력&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;콤마로 구분된 CSV 텍스트 파일을 자동으로 &lt;b&gt;DataFrame(엑셀 스프레드시트 같은 표 형태)&lt;/b&gt;으로 만들어준다. 예전 같으면 반복문 돌려서 하나씩 파싱해야 할 것을 한 줄로 처리 가능.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;Numpy&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;Numerical Python&lt;/code&gt;의 약자&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파이썬의 고성능 과학 계산용 패키지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;Matrix와 Vector 같은 Array 연산&lt;/b&gt;을 할 때 사용하는 표준 라이브러리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;일반 List에 비해 빠르고, 메모리를 효율적으로 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;반복문 없이 데이터 배열에 대한 처리를 지원&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;선형대수 관련 다양한 기능 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;C, C++, 포트란 등의 언어와 통합 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;머신러닝/딥러닝의 기반이 되는 라이브러리라 뒤에서 계속 쓴다고 하셨음.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;Matplotlib&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;그림이나 도형을 그려주는 파이썬 시각화 라이브러리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;표준 플롯을 쉽게 그릴 수 있고, 복잡한 플롯이나 세부 변경도 자유로움&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;Numpy 및 Pandas(Series, DataFrame)가 제공하는 자료와 잘 연동&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;x/y축 데이터만 넣으면 차트가 나오는 수준으로 편함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2.3 왜 데이터 분석에 CSV를 쓸까?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;CSV = Comma Separated Values&lt;/b&gt;, 쉼표로 구분된 일반 텍스트 형식.&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;CSV는 구현 및 구문 분석이 간단&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;CSV는 모든 소프트웨어가 읽을 수 있는 형식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;CSV는 &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 style=&quot;font-family: GungSeo, serif;&quot;&gt;엑셀(.xlsx)과 자주 비교되는데, 서식이나 수식이 필요없고 순수 데이터만 다룰 때는 CSV가 압도적으로 유리.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2.4 개발환경 &amp;mdash; Google Colab&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;콜랩(Colab)&lt;/b&gt; = 클라우드 기반의 무료 Jupyter Notebook 개발환경.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;핵심 특징:&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;공짜&lt;/b&gt; (12시간까지 GPU 무료 사용)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;쉽다&lt;/b&gt; (설치 필요 없음)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;클라우드 기반&lt;/b&gt; &amp;mdash; 크롬만 있으면 어디서든 접속&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;학습 및 공유 최고&lt;/b&gt; &amp;mdash; 팀원과 코드 공유 가능, 여러 명이 동시에 수정 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;오류 발생 시 자동 검색&lt;/b&gt; 기능 지원&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;Jupyter Notebook과 완전 호환&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;코딩 글꼴 세팅 (★필수)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;브라우저 설정 &amp;rarr; 모양 &amp;rarr; 글꼴 맞춤 설정 &amp;rarr; 표준 글꼴을 &lt;b&gt;Consolas&lt;/b&gt; 같은 코딩 전용 글꼴로 변경한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;안 하면 숫자 &lt;code&gt;0&lt;/code&gt;과 알파벳 &lt;code&gt;O&lt;/code&gt;, 숫자 &lt;code&gt;1&lt;/code&gt;과 알파벳 &lt;code&gt;l&lt;/code&gt;/&lt;code&gt;I&lt;/code&gt;가 구분이 안 돼서 오타 잡을 때 지옥이 열린다. 코딩 폰트에 취향 있는 개발자들이 있을 정도로 중요한 세팅.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;코딩 글꼴은 실제로 세팅하니 숫자/알파벳 구분이 확 살아나서 놀랐다. Pandas/Numpy/Matplotlib은 이름만 알고 있었는데 각자의 역할과 왜 이 3개가 세트로 나오는지 감이 왔다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3. 파이썬 기초 문법&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3.1 변수 (Variable)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&quot;어떠한 값을 넣는 상자&quot;&lt;/b&gt; &amp;mdash; &lt;code&gt;변수 이름 = 넣는 값&lt;/code&gt; 형태로 선언.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;golo&quot;&gt;&lt;code&gt;var = 100
print(var)   # 100

var = &quot;나는 변수다!&quot;
print(var)   # 나는 변수다!&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;의미 있게&lt;/b&gt; 선언할 것 &amp;mdash; 변수명만 봐도 무엇이 들어있는지 추정 가능해야 함. &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt; 같은 이름은 지양.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;숫자로 시작 불가&lt;/b&gt;: &lt;code&gt;2025_income&lt;/code&gt; ❌ &amp;rarr; &lt;code&gt;income_2025&lt;/code&gt; ✅&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;_&lt;/code&gt; 를 제외한 특수기호 사용 불가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;변수명 중간에 공백 불가 &amp;rarr; 단어 연결은 &lt;code&gt;_&lt;/code&gt;로 (예: &lt;code&gt;my_name&lt;/code&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;예약어(keyword) 사용 불가&lt;/b&gt;: &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;sum&lt;/code&gt; 등 파이썬이 이미 문법적으로 쓰고 있는 단어들&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;예약어를 제외한 영문과 한글은 선언 가능 (한글 변수 가능하지만 실무에선 영문 권장)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;예약어 목록은 아래처럼 확인 가능:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;import keyword
print(keyword.kwlist)
# ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class',
#  'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
#  'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal',
#  'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파이썬의 편의성&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;자바와 달리 자료형을 미리 선언하지 않아도 값 보고 자동 판단한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;name = '이름'       # 문자열
age = 25              # 정수
point = 35.997        # 실수
print(name)           # 이름&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3.2 사칙연산&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;num1 = 100
num2 = 200
result = num1 + num2
print(result)   # 300&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;+ - * /&lt;/code&gt; 는 익숙한 대로. &lt;code&gt;%&lt;/code&gt;는 &lt;b&gt;나머지 연산자&lt;/b&gt;(퍼센트 아님). 문자열 포맷팅 지시자로도 쓰여서 처음엔 헷갈릴 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3.3 문자열 다루기 &amp;mdash; 파이썬을 파이썬답게 만드는 부분&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열 슬라이싱&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;word = '안녕하세요 반갑습니다.'
print(word)          # 안녕하세요 반갑습니다.
print(word[0:2])     # 안녕      &amp;larr; 끝 인덱스는 +1 필요
print(word[6:12])    # 반갑습니다
print(word[6:])      # 반갑습니다.    &amp;larr; 끝 생략하면 문자열 끝까지
print(word[-1])      # .              &amp;larr; 뒤에서 첫 번째&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;다른 언어는 문자열에서 특정 위치를 뽑으려면 반복문을 돌려야 하는데, 파이썬은 인덱싱 하나로 끝난다. 슬라이싱 결과에 +1을 해줘야 하는 규칙은 [시작, 끝) 구간 표기로 이해하면 일관성이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열 연결 연산자 &lt;code&gt;+&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;str1 = '안녕'
str2 = '하세요'
str_result = str1 + str2
print(str_result)     # 안녕하세요&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;주의: &lt;code&gt;str_result + age&lt;/code&gt; 처럼 &lt;b&gt;문자열 + 정수형은 오류&lt;/b&gt; 발생. 형변환 필수.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&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&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;str(x)&lt;/code&gt;: 문자열로&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;int(x)&lt;/code&gt;: 정수로&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;float(x)&lt;/code&gt;: 실수로&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;print(str_result + str(age))   # 안녕하세요26&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열 반복 연산자 &lt;code&gt;*&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;print(str1 * 20)
# 안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕안녕&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;콘솔에 구분선 그을 때 유용 (&lt;code&gt;print('=' * 30)&lt;/code&gt; 같은 패턴).&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열 길이 &lt;code&gt;len()&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;len(word)                       # 12
print(word[6:len(word)])        # 반갑습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;len()&lt;/code&gt;은 셀 때 1부터, 인덱스는 0부터라는 차이만 기억.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열 포맷팅&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;+&lt;/code&gt; 연결과 &lt;code&gt;str()&lt;/code&gt; 형변환 반복을 대체하는 방식.&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;코드&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;의미&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;%s&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;string (문자열)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;%d&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;digit (정수)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;%f&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;floating point (실수, 전체 자릿수)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;%.1f&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;실수 소수점 첫째 자리까지 (둘째 자리에서 반올림)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;%.3f&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;실수 소수점 셋째 자리까지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;x = '저의 나이는 %d살 입니다.' % age
print(x)     # 저의 나이는 26살 입니다.

kor = 88
eng = 95
math = 100
total = kor + eng + math
avg = total / 3
print('%s님 총점은 %d, 평균 점수는 %.3f입니다.' % (name, total, avg))
# ooo님 총점은 283, 평균 점수는 94.333입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;포맷팅 실습 &amp;mdash; 강아지 정보&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;dog_name = '츄츄'
dog_age = 8
dog_type = '포메리안'
print('%s님, %d세, %s입니다.' % (dog_name, dog_age, dog_type))
# 츄츄님, 8세, 포메리안입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;머신러닝/딥러닝 결과 출력할 때 포맷팅을 계속 쓴다고 강조하였다. 자릿수만 조정하고 싶을 때 코드 통째로 다시 짜지 않고 &lt;code&gt;%.3f&lt;/code&gt;의 숫자만 바꾸면 되니 편하며, AI한테 &quot;다섯 자리로 출력해줘&quot; 하고 코드 다시 받는 것보다 훨씬 빠르다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3.4 사용자 입력 &lt;code&gt;input()&lt;/code&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;dog_name = input('이름을 입력하시오:')
print('%s님 반갑습니다.' % (dog_name))
dog_age = int(input('나이를 입력하시오:'))
dog_type = input('견종을 입력하시오:')
print('%s님, %d세, %s입니다.' % (dog_name, dog_age, dog_type))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;⚠️ &lt;b&gt;핵심 함정&lt;/b&gt;: &lt;code&gt;input()&lt;/code&gt;의 리턴값은 &lt;b&gt;무조건 문자열&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;num1 = input('첫번째 정수를 입력하세요: ')   # '100' 입력
num2 = input('두번째 정수를 입력하세요: ')   # '200' 입력
print(num1 + num2)                          # 100200  &amp;larr; 문자열 연결!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;숫자로 쓰려면 반드시 &lt;code&gt;int()&lt;/code&gt;로 감싸야 함:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;num1 = int(input('첫번째 정수를 입력하세요: '))
num2 = int(input('두번째 정수를 입력하세요: '))
print(num1 + num2)   # 300&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3.5 주석문&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;# 한 줄 주석

'''
여러 줄 주석
장문의 설정이나 프로그램 설명용
'''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;한 줄 주석은 &lt;code&gt;#&lt;/code&gt;, 여러 줄 주석은 작은따옴표 3개(&lt;code&gt;'''&lt;/code&gt;)로 감싼다. AI에게 코드 짜달라고 할 때 &quot;주석 붙여서&quot; 요청하면 훨씬 검토하기 좋음.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;슬라이싱은 처음엔 뒷자리 +1 규칙이 어색했는데, [시작, 끝) 구간 개념으로 이해하니 오히려 일관성 있어 보인다. 음수 인덱스로 뒤에서 세는 게 나중에 데이터 마지막 N개 뽑을 때 정말 편할 것 같다. &lt;code&gt;input()&lt;/code&gt;이 무조건 문자열 반환하는 부분은 실제로 &lt;code&gt;100 + 200 = 100200&lt;/code&gt; 결과가 뜨는 걸 보고 감이 확 왔다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4. 조건문&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4.1 기본 구조&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;if 조건1:
    코드A    &amp;larr; 조건1이 참이면 실행
elif 조건2:
    코드B    &amp;larr; 조건1 거짓, 조건2 참이면 실행
else:
    코드C    &amp;larr; 조건1, 조건2 모두 거짓이면 실행
코드D        &amp;larr; 위 흐름 이후 항상 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;파이썬은 중괄호가 아니라 들여쓰기(indentation)로 블록을 구분&lt;/b&gt;한다. 잘못 들여쓰면 논리 전체가 뒤집힌다.&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;else&lt;/code&gt;는 필수가 아님. 조건 만족했을 때만 처리할 거면 &lt;code&gt;if&lt;/code&gt; 하나로 끝.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;조건이 여러 개면 &lt;code&gt;elif&lt;/code&gt;로 이어붙임.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4.2 비교 연산자&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;height: 150px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 24px;&quot;&gt;
&lt;th style=&quot;height: 24px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;연산자&lt;/span&gt;&lt;/th&gt;
&lt;th style=&quot;height: 24px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;의미&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;a == b&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;a와 b가 같다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;a != b&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;같지 않다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;a &amp;gt; b&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;a가 크다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;a &amp;gt;= b&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;a가 크거나 같다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;a &amp;lt; b&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;a가 작다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;a &amp;lt;= b&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;a가 작거나 같다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;규칙&lt;/b&gt;: 비교하고자 하는 주체를 앞에 쓴다. &lt;code&gt;대전시 &amp;gt; 서울시&lt;/code&gt; 형태로 방향을 명확히.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;=&lt;/code&gt;은 값을 담는 대입, &lt;code&gt;==&lt;/code&gt;은 같은지 비교. 이거 헷갈리면 조건문이 통째로 무너진다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4.3 논리 연산자&lt;/span&gt;&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;연산자&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;의미&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;조건1 and 조건2&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;논리곱 &amp;mdash; 둘 다 참이어야 참&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;조건1 or 조건2&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;논리합 &amp;mdash; 하나만 참이어도 참&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;not 조건&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;부정 &amp;mdash; 참/거짓을 뒤집음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;강사님이 소개팅 조건으로 설명한 게 직관적이었음: &quot;키 크고 &lt;b&gt;and&lt;/b&gt; 잘생겨야 함&quot; vs &quot;키 크거나 &lt;b&gt;or&lt;/b&gt; 잘생기거나 상관없음&quot;.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4.4 실습 ① 양수/음수/영 판별&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;x = int(input('정수를 입력하세요: '))

if x &amp;gt; 0:
    print('입력된 수는 양수입니다.')
elif x == 0:
    print('입력된 수는 0입니다.')
else:
    print('입력된 수는 음수입니다.')&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4.5 실습 ② 용돈 조건 (and / or 조합)&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;math = 90
kor = 70
money = 50000

if math &amp;gt;= 80 and kor &amp;gt;= 90:
    print('용돈을 %d원으로 올려줄게! 수고했어' % (money * 1.1))
elif math &amp;gt;= 90 or kor &amp;gt;= 90:
    print('용돈을 %d원으로 올려줄게! 수고했어' % (money * 1.05))
else:
    print('다음에 열심히 해라')&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4.6 실습 ③ 매표소 키오스크&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;강의 미션이었고, 여기에 음수 입력 방어까지 추가로 붙였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;age = int(input('나이가 어떻게 되시나요: '))
price = 2000

if age &amp;gt;= 65:
    print('당신의 나이는 %d입니다. 입장권은 무료입니다.' % (age))
elif 0 &amp;lt; age &amp;lt; 65:
    print('당신의 나이는 %d입니다. 입장권은 %d원입니다.' % (age, price))
else:
    print('나이를 다시 입력하세요')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;강의 요구는 65세 이상 무료 / 그 외 2000원 두 가지 분기였지만, &lt;code&gt;0 &amp;lt; age &amp;lt; 65&lt;/code&gt; 조건을 명시적으로 넣어서 &lt;b&gt;음수나 0 입력에 대한 방어&lt;/b&gt;를 추가했다. 파이썬은 &lt;code&gt;0 &amp;lt; age &amp;lt; 65&lt;/code&gt;처럼 수학 표기 그대로 쓸 수 있는 게 편하다 (다른 언어는 &lt;code&gt;0 &amp;lt; age &amp;amp;&amp;amp; age &amp;lt; 65&lt;/code&gt;로 풀어써야 함).&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;조건문 자체는 어렵지 않지만 &lt;b&gt;순서 배치&lt;/b&gt;가 코드 품질을 갈랐다. 나중에 단어 퀴즈에서 &quot;stop 입력 시 종료&quot; 조건을 정답 비교 뒤에 놓으니 매번 두 번 비교하는 낭비가 생겼다. 종료 조건을 앞에 두면 정답 비교 자체가 스킵되니 훨씬 효율적. 매표소 예제에서 음수 방어를 넣어본 것도 실무 감각으로는 자연스럽지만 강의 요구사항만 보면 없어도 되는 조건이었는데, 이런 걸 스스로 넣는 습관을 들이는 게 중요할 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;5. 반복문&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;5.1 &lt;code&gt;range()&lt;/code&gt; 함수 &amp;mdash; 반복 횟수 발급기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;반복 횟수를 숫자로 지정할 때 쓴다. 강사님 표현으로는 &quot;번호표 발급기&quot;.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;range(10)        # 0 ~ 9  (총 10개)
range(4, 11)     # 4 ~ 10 (총 7개, 뒤는 +1 규칙 동일)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;5.2 &lt;code&gt;for&lt;/code&gt; 문&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정해진 시퀀스를 순회할 때 사용.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;for i in range(10):
    print(i)          # 0, 1, 2, ..., 9

for i in range(4, 11):
    print(i)          # 4, 5, 6, ..., 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문자열도 그대로 순회 가능:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;words = input('단어를 입력하세요:')
for word in words:
    print(word)
# 안녕하세요 입력 시
# 안 / 녕 / 하 / 세 / 요 로 한 글자씩 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;파이썬의 매력 포인트 &amp;mdash; 인덱스 없이 값을 바로 꺼낼 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;5.3 &lt;code&gt;while&lt;/code&gt; 문 &amp;mdash; 조건 기반 반복&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;조건이 만족하는 동안&lt;/b&gt; 계속 반복. 종료 시점이 로직에 달려있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;1부터 10까지 합&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;total = 0
i = 1
while i &amp;lt;= 10:
    total = total + i
    i = i + 1          # &amp;larr; 탈출 코드! 반드시 필요
print('1부터 10까지의 합은 %d입니다.' % (total))    # 55&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;⚠️ &lt;b&gt;탈출 코드(&lt;code&gt;i = i + 1&lt;/code&gt;)가 없으면 무한루프&lt;/b&gt;. 조건이 영원히 참이라 브라우저 강제종료 해야한다. &lt;code&gt;while&lt;/code&gt;을 쓸 때는 이 부분이 필수 요소이다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;5.4 &lt;code&gt;while True&lt;/code&gt; + &lt;code&gt;break&lt;/code&gt; 패턴&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;탈출 조건 없이 시작해서 특정 이벤트에서 빠져나오는 패턴이다. 게임 루프나 대화형 프로그램에 쓴다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;while True:                            # 무조건 반복 시작
    word = input('단어를 입력하세요: ')
    if word == 'stop':
        print('프로그램을 종료합니다.')
        break                          # 반복문 탈출
    print(word)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;for&lt;/code&gt; 문 안에서도 &lt;code&gt;break&lt;/code&gt; 사용 가능:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;for i in range(1, 11):
    total = total + i
    if i == 5:
        break             # 5까지만 돌고 종료&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;실험용/디버깅용으로 특정 지점까지만 반복 돌릴 때 유용. 몇만 개 데이터 학습시키기 전에 10개만 돌려보는 식.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;5.5 &lt;code&gt;for&lt;/code&gt; vs &lt;code&gt;while&lt;/code&gt; 비교&lt;/span&gt;&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;구분&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;for&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;while&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;언제 쓰나&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;반복 횟수/구간이 정해져 있을 때&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;조건에 따라 반복시켜야 할 때&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;종료&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;range/시퀀스가 끝나면 자동&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;조건이 거짓이 되거나 break 실행&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;위험도&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;낮음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;무한루프 가능 &amp;rarr; 탈출 코드 필수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;코드 길이&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;짧음 (같은 문제 기준)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&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;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;같은 &quot;1부터 10까지 합&quot; 문제도 &lt;code&gt;for&lt;/code&gt;는 세 줄이면 끝나고, &lt;code&gt;while&lt;/code&gt;은 다섯 줄 이상 필요. &lt;b&gt;구간이 명확하면 무조건 &lt;code&gt;for&lt;/code&gt;가 경제적&lt;/b&gt;, 조건 종료가 필요하면 &lt;code&gt;while&lt;/code&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;반복문 자체 개념은 다른 언어에서 봤어서 낯설진 않았다. 다만 파이썬의 &lt;code&gt;for i in &amp;lt;시퀀스&amp;gt;&lt;/code&gt; 문법이 인덱스 안 챙기고 값을 바로 꺼낼 수 있다는 게 확실히 매력적이다. &lt;code&gt;range&lt;/code&gt; 함수는 앞으로 계속 나올 것 같다. 무한루프 실수 경고는 남 얘기 같지 않아서 특히 조심해할 것 같다..&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6. 자료구조&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;지금까지 변수 하나에 값 하나만 담았다면, 이제 여러 값을 한 번에 담는 방법. 세 가지가 있고 각각 목적이 다르다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6.1 리스트 (List) &amp;mdash; &lt;code&gt;[ ]&lt;/code&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&quot;여러 값을 모을 수 있는 자료형&quot;&lt;/b&gt;. 한 줄 기차 같은 자료구조. 순서가 있고, 인덱스로 접근하며, 수정&amp;middot;추가&amp;middot;삭제 모두 가능.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;생성&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;list1 = [1, 3, '사과', '딸기']       # 서로 다른 자료형도 한 리스트에 가능
list2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = list(range(1, 11))           # range와 조합해서 간편하게 생성&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;요소 추출 (문자열 인덱싱과 동일)&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;colors = ['빨강', '주황', '노랑', '초록', '파랑', '남색', '보라']
# 리스트 변수는 복수형으로 짓는 습관 (colors, animals ...)

colors[1]         # '주황'
colors[2:5]       # ['노랑', '초록', '파랑']   &amp;larr; 슬라이싱 결과는 다시 리스트
colors[6]         # '보라'
colors[-1]        # '보라' (뒤에서 첫 번째)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;한 개 추출 시 원본 자료형(문자열)으로, 슬라이싱 시 리스트로 반환된다는 차이가 중요.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;요소 수정 &amp;mdash; 덮어쓰기&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;colors[1] = '회색'
# ['빨강', '회색', '노랑', ...]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;인덱스 자리에 값이 있으면 그 자리를 &lt;b&gt;덮어쓰기&lt;/b&gt;. 뒤로 밀리지 않음.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;요소 추가 &lt;code&gt;append()&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;colors[7] = '금색'          # ❌ IndexError: list assignment index out of range
colors.append('금색')       # ✅ 리스트 맨 뒤에 추가&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;없는 인덱스에 직접 대입은 오류. 반드시 &lt;code&gt;append()&lt;/code&gt;로 뒤에 붙여야 함.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;요소 삽입 &lt;code&gt;insert()&lt;/code&gt; &amp;mdash; 특정 자리에 끼워넣기&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;colors.insert(0, '은색')    # 0번 자리에 '은색' 삽입, 뒤 요소들이 한 칸씩 밀림&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;요소 삭제 &lt;code&gt;remove()&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;colors.remove('은색')       # 값으로 지정해서 삭제&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;요소 잘라내기 &lt;code&gt;pop()&lt;/code&gt; &amp;mdash; 삭제 + 반환&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;color = colors.pop(1)       # 1번 자리 요소를 꺼내면서 삭제
# color 변수에 담기고, colors에서는 사라짐&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;remove()&lt;/code&gt;는 그냥 지우기, &lt;code&gt;pop()&lt;/code&gt;은 잘라내기(잘라낸 값을 다른 곳에 옮길 수 있음).&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트 병합 &lt;code&gt;+&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;merge_list = list1 + list2 + colors
# 순서대로 이어붙여짐&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;+&lt;/code&gt; 하나로 리스트 결합. 다른 언어라면 반복문이나 concat 함수가 필요한 작업.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;순서 뒤집기 &lt;code&gt;reverse()&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;list2.reverse()             # 원본이 뒤집힘 (주의)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정렬 &lt;code&gt;sort()&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;colors.sort()                    # 기본값: 오름차순 (ㄱ~ㅎ, a~z)
colors.sort(reverse=True)        # 내림차순&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;기본값이 오름차순이라는 것 기억. 한글은 자모순으로 정렬됨.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트를 for 문으로 순회&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;for color in colors:
    print('나는 %s를 좋아합니다.' % (color))&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6.2 튜플 (Tuple) &amp;mdash; &lt;code&gt;( )&lt;/code&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&quot;여러 값을 모을 수 있는 자료형 + 한 번 생성하면 수정 불가&quot;&lt;/b&gt; = 리스트의 읽기 전용 버전.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;생성&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;animals = ('토끼', '거북이', '사자', '여우')&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;접근 &amp;mdash; 리스트와 동일&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;animals[0]        # '토끼'
animals[0:2]      # ('토끼', '거북이')   &amp;larr; 결과도 튜플&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;수정 시도하면?&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;animals[0] = '고양이'
# TypeError: 'tuple' object does not support item assignment&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;왜 튜플을 쓰나?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;보안/보존 목적&lt;/b&gt;. 절대 바뀌면 안 되는 데이터 저장 시 사용.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;# 관리자 정보 저장
admin_info = ('admin', '12345', 'master@naver.com')
print(admin_info[0])   # admin
print(admin_info[1])   # 12345
print(admin_info[2])   # master@naver.com&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;함수 사이로 데이터를 안전하게 넘길 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;원본이 절대 바뀌면 안 되는 상수 데이터&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;병합(&lt;code&gt;+&lt;/code&gt;)은 가능하지만 중간 삽입/수정/삭제는 안 됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6.3 딕셔너리 (Dictionary) &amp;mdash; &lt;code&gt;{ }&lt;/code&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&quot;키(key)와 값(value)의 쌍으로 데이터를 저장&quot;&lt;/b&gt;. 인덱스 번호가 아니라 내가 지은 이름으로 값에 접근.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;생성&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;member = {
    'name': '장성연',
    'age': 42,
    'id': 'admin',
    'password': 1234
}
print(member)
# {'name': '장성연', 'age': 42, 'id': 'admin', 'password': 1234}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;접근&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;member['name']       # '장성연'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;키가 열쇠 역할. 열쇠(키)를 넣으면 그 자리의 값이 나옴.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;수정/추가&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;member['name'] = '오재원'         # 키가 있으면 &amp;rarr; 덮어쓰기
member['email'] = 'admin@naver.com'  # 키가 없으면 &amp;rarr; 새로 추가&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트/튜플과 결정적 차이: &lt;b&gt;없는 키에 값을 넣어도 오류가 아니라 그냥 추가된다&lt;/b&gt;. 인덱스 범위를 신경 쓸 필요가 없음. 확장성이 가장 큰 자료구조인 이유.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;전체 삭제 &lt;code&gt;clear()&lt;/code&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;member.clear()      # {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;데이터를 담았다가 다시 담는 반복 작업에서 유용.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;for 문에서 사용 &amp;mdash; 주의점&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트/튜플의 for 문은 &lt;b&gt;값&lt;/b&gt;을 건네지만, 딕셔너리의 for 문은 &lt;b&gt;키&lt;/b&gt;를 건넨다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;for key in member:       # key만 넘어옴
    print(member[key])   # 값이 필요하면 다시 조회해야 함&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6.4 실습 &amp;mdash; 영어 단어 퀴즈 프로그램&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;딕셔너리 + &lt;code&gt;while True&lt;/code&gt; + &lt;code&gt;break&lt;/code&gt; + &lt;code&gt;if/elif/else&lt;/code&gt; 총출동.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;words = {'꽃': 'flower', '나비': 'butterfly', '학교': 'school', '자동차': 'car'}

print('***영어 단어 맞추기 퀴즈 시작***')

for key in words:
    input_word = input('%s에 해당되는 영어 단어를 입력하세요: ' % key)

    if input_word == 'stop':          # 종료 조건을 앞에 배치 (효율)
        print('퀴즈를 종료합니다.')
        break
    elif input_word == words[key]:
        print('정답입니다.')
    else:
        print('오답입니다.')

print('***영어 단어 맞추기 퀴즈 끝***')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;주요 포인트:&lt;/span&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;for key in words&lt;/code&gt;로 딕셔너리 키를 순회&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;words[key]&lt;/code&gt;로 정답 값을 조회&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;stop&lt;/code&gt; 조건을 &lt;b&gt;정답 비교보다 먼저&lt;/b&gt; 배치해서 불필요한 비교를 스킵&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;while True&lt;/code&gt; 대신 &lt;code&gt;for&lt;/code&gt;로도 종료 로직을 넣을 수 있음을 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6.5 세 자료구조 비교 요약&lt;/span&gt;&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;구조&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;기호&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;순서&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;수정&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;접근 방식&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;주 용도&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;[ ]&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;인덱스 (숫자)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;순서 있는 데이터, 자주 바뀌는 값&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;튜플&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;( )&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;❌&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;인덱스 (숫자)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;보호가 필요한 데이터, 읽기 전용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;딕셔너리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;code&gt;{ }&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;X (키 기반)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;O&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;키 (이름)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: GungSeo, serif;&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;span style=&quot;font-family: GungSeo, serif;&quot;&gt;정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;튜플의 존재 이유가 처음엔 애매했는데, &quot;함수 사이로 데이터를 안전하게 넘길 때 중간에 조작 못 하게&quot; 라는 관점에서 이해가 됐다. 딕셔너리는 pandas의 컬럼 접근과 감각이 같다고 하니 미리 익숙해두면 좋을 것 같음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;헷갈릴 만한 세 지점&lt;/b&gt; 확실히 정리:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;리스트 슬라이싱 결과 &amp;rarr; 리스트&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;튜플 슬라이싱 결과 &amp;rarr; 튜플&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;딕셔너리 for 순회 &amp;rarr; &lt;b&gt;키&lt;/b&gt;만 넘어옴 (값은 다시 조회 필요)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이 세 개는 자주 실수할 지점이라 손에 익을 때까지 반복하자.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;오늘의 총평&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;문법 자체는 4학년까지 오면서 대부분 접해본 개념이었지만, &lt;b&gt;파이썬만의 편의성&lt;/b&gt;(음수 인덱스, 슬라이싱 표기법, 자료형 자동 판정, 리스트 &lt;code&gt;+&lt;/code&gt; 이어붙이기, 다중 조건 수학 표기, 문자열 반복 연산자 등)이 어디에서 나오는지 감을 잡는 시간이었다. 그동안 AI 붙여쓰기로 대충 넘어갔던 부분들이 오늘 코드를 손으로 치면서 &quot;아 이래서 이 언어를 쓰는구나&quot; 하는 순간이 여러 번 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;특히 인상 깊었던 포인트&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&lt;code&gt;input()&lt;/code&gt;은 무조건 문자열 반환&lt;/b&gt; &amp;rarr; 형변환 습관 필수&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&lt;code&gt;while&lt;/code&gt; 루프는 탈출 코드가 필수&lt;/b&gt; &amp;rarr; 안 넣으면 브라우저 강제종료&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;&lt;code&gt;for&lt;/code&gt; vs &lt;code&gt;while&lt;/code&gt;은 상황 따라 골라야 함&lt;/b&gt; &amp;rarr; 구간이면 for, 조건이면 while&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;자료구조 선택도 설계의 일부&lt;/b&gt; &amp;rarr; 리스트냐 튜플이냐 딕셔너리냐는 취향이 아니라 데이터 성격에 맞춰야 함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;AI에게 코드 부탁할 때도 문법을 알아야 검토가 가능&lt;/b&gt; &amp;rarr; 자릿수 미세 조정 같은 걸 AI에 다시 시키느니 직접 아는 게 훨씬 빠름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;조건문의 순서 배치&lt;/b&gt;도 성능/가독성에 영향 &amp;rarr; 종료 조건은 앞으로&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&amp;nbsp;파이썬 기본기는 앞으로 계속 밑바탕이 될 텐데, 오늘 문법을 그냥 &quot;아 이거 해봤음&quot;으로 넘기지 말고 손에 확실히 익혀두자.&lt;/span&gt;&lt;/p&gt;</description>
      <category>MLOps엔지니어</category>
      <category>ABC부트캠프</category>
      <category>AI캠퍼스</category>
      <category>AI파일럿</category>
      <category>mlops</category>
      <category>고용노동부</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/37</guid>
      <comments>https://ideas9064.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 26 Jul 2026 13:07:40 +0900</pubDate>
    </item>
    <item>
      <title>ABC 부트캠프 AI파일럿 1기 MLOps 1일차</title>
      <link>https://ideas9064.tistory.com/36</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;MLOps 엔지니어 과정 시작!&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2026년 7월 22일. 오늘부터 유클리드소프트 KDT MLOps 엔지니어 교육과정이 시작되었다. 대전지식산업센터에 8시 45분까지 도착.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;새로운 사람들 앞에서 인사하고, 앞으로 8개월이라는 긴 시간을 같이 해야 할 사람들과 만나야 된다는 게 진짜 긴장되고 떨렸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;조원들을 처음 만났을 때는 어색한 공기가 계속 흐르고 있었다. 다들 처음이니까 어쩔 수 없이 서로 눈치만 보면서 짧게 인사만 하다가, 발대식 시작 전까지 각자 적막한 공간에서 휴대폰만 바라보고 있었다. 언제 시작하나 기다리는 그런 시간...&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;발대식&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NjLOl/dJMcahrN2Fp/fqdRJJpIS2jTwLQJP8aKuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NjLOl/dJMcahrN2Fp/fqdRJJpIS2jTwLQJP8aKuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NjLOl/dJMcahrN2Fp/fqdRJJpIS2jTwLQJP8aKuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNjLOl%2FdJMcahrN2Fp%2FfqdRJJpIS2jTwLQJP8aKuK%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;821&quot; height=&quot;783&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;마침내 10시. 적막을 깨는 발대식이 시작되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;발대식에서는 유클리드소프트 측에서 우리를 환영해주는 인사를 해주셨고, 앞으로 이 긴 여정을 도와주실 담당 선생님들의 인사가 이어졌다. 그리고 대표님의 좋은 말씀과 8개월간 긴 여정 동안 동기를 불어넣어 주시는 말씀을 해주시며 발대식이 마무리되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;근데 아직 조원들 사이에는 어색한 공기가 남아 있었다. 그래서 이어서 퍼실리테이션이 진행되었다!&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;퍼실리테이션 &amp;mdash; 포스트잇 자기소개&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;A4 용지에 포스트잇 6개가 붙여져 있는 걸 나눠주셨다. 포스트잇에는 &lt;b&gt;이름 / 전공 / MBTI / 듣고 싶은 형용사&lt;/b&gt; 이렇게 적혀 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;6개의 내용을 모두 채우고, 앞에 있는 사람과 옆 사람 그리고 대각선에 있는 사람에게 이 포스트잇을 전달하면서 인사를 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이 시간을 통해 길지는 않지만 대화하고 인사를 나누다 보니 뭔가.. 가까워지는 느낌이 들어서 신기했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;조원이 나 포함 총 4명이라서 3장은 조원들과 나눠주고, 나머지 3장은 자리에서 일어나 다른 사람들과 인사를 나누며 얼굴을 익혀 나갔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;돌아다니면서 느낀 건데, 여기 생각보다 정말 다양한 나이대와 다양한 분야에서 일하고 계신 분들이 지원하셨다는 걸 알게 되었다. 여기서 내가 든 생각은, 각자 원래 공부했던 분야에 다른 분야를 결합해서 더 나은 무언가를 하시려 한다는 인상이었다. 나도 정보통신공학 베이스에 클라우드&amp;middot;MLOps를 붙이려는 트랙이라, 이런 다양성 안에 있다는 것 자체가 하나의 자극이 되는 느낌이었다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;점심&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이렇게 교환이 끝나고 점심시간이 다가와 점심을 먹었다. 조원 3명 + 운영진 두 분과 같이 앉아서 피자 2판을 먹었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;오랜만에 피자를 먹게 되었는데.. 다른 분들께서 피자를 많이 드시지 않아서 나 혼자 남들보다 2배는 더 먹은 것 같다 ㅋㅋ 그래서 배불리 잘 먹었다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;Career Tent Design&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EzUFL/dJMcadCJVNG/pVGKxUv2lPJWakOtNg0OEK/tfile.avif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EzUFL/dJMcadCJVNG/pVGKxUv2lPJWakOtNg0OEK/tfile.avif&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;1006&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EzUFL/dJMcadCJVNG/pVGKxUv2lPJWakOtNg0OEK/tfile.avif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEzUFL%2FdJMcadCJVNG%2FpVGKxUv2lPJWakOtNg0OEK%2Ftfile.avif&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;566&quot; height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kV6kv/dJMcagGrMn8/kQknurqKoNfQjm46SEKj6K/tfile.avif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kV6kv/dJMcagGrMn8/kQknurqKoNfQjm46SEKj6K/tfile.avif&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;1006&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kV6kv/dJMcagGrMn8/kQknurqKoNfQjm46SEKj6K/tfile.avif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkV6kv%2FdJMcagGrMn8%2FkQknurqKoNfQjm46SEKj6K%2Ftfile.avif&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;566&quot; height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이렇게 점심에 잠시 쉬고 2시쯤에 career tent design을 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;개발자라면 결국 나의 생각과 구상하는 것을 좀 더 가깝게 표현하고 나타내야 한다. 그렇기 전에 먼저 나를 이해하고 있어야 하고, 그걸 손으로 표현할 줄도 알아야 한다. 그래서 어렸을 때 가지고 놀았던 레고 블럭들을 이용해 표현해보는 시간을 가졌다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;1) Campfire Talk &amp;mdash; 손으로 생각하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;자기소개 모형을 만들어 나의 상태를 가시화하고, 나의 위치를 진단해보는 시간.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r5Jxa/dJMcahZxrgI/H0Xvd5BovnnwhdO43gJYOK/tfile.avif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r5Jxa/dJMcahZxrgI/H0Xvd5BovnnwhdO43gJYOK/tfile.avif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r5Jxa/dJMcahZxrgI/H0Xvd5BovnnwhdO43gJYOK/tfile.avif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr5Jxa%2FdJMcahZxrgI%2FH0Xvd5BovnnwhdO43gJYOK%2Ftfile.avif&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;1197&quot; height=&quot;667&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;뭔가 쉽지는 않았다. 레고로 나를 표현한다.. 음... 아무리 뇌를 짜내도 생각이 잘 떠오르지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이걸 하면서 느낀 건데, 짧은 영상과 도파민이라는 쇼츠&amp;middot;릴스에 뇌가 절여져서 그런지.. 예전보다 뇌에서 이런 표현 능력과 상상하는 능력이 많이 떨어졌다는 걸 느꼈다 ㅠㅠ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;근데 다른 조원분들이 만든 걸 보니까 오..! 굉장히 자기 이해도가 높고, 스스로에 대해 많이 생각하시고, 그 안에서 다양한 아이디어를 뽑아내는 게 진짜 인상 깊었다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;2) Self Compass &amp;mdash; 강점과 자산&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;두 번째는 자기 이해 시간. 나의 강점과 자산을 알아가는 시간이었다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAIHYf/dJMcabdUaxL/2NMMYSaOIO7CQ22R8Hkqf0/tfile.avif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAIHYf/dJMcabdUaxL/2NMMYSaOIO7CQ22R8Hkqf0/tfile.avif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAIHYf/dJMcabdUaxL/2NMMYSaOIO7CQ22R8Hkqf0/tfile.avif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAIHYf%2FdJMcabdUaxL%2F2NMMYSaOIO7CQ22R8Hkqf0%2Ftfile.avif&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;1318&quot; height=&quot;737&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;쓰읍.. 이번에도 쉽지 않았다. 아직 내가 뭘 이루었고 어떤 걸 가졌는지도 잘 모르겠고, 아직 살면서 한 것들 중에 남들보다 그렇게 잘하고 뛰어나다고 말할 수 있는 게 딱히 없어서 너무 어려웠다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;3) Trail Block &amp;mdash; 장애 요인과 해결&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;다음은 장애 요인과 해결! 목표를 향해 나아가는데 있어 가장 큰 걸림돌이 뭔지에 대한 시간이었다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdcSEH/dJMcagGrMpd/AevBCW1rv1odmkK9Weg5X0/tfile.avif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdcSEH/dJMcagGrMpd/AevBCW1rv1odmkK9Weg5X0/tfile.avif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdcSEH/dJMcagGrMpd/AevBCW1rv1odmkK9Weg5X0/tfile.avif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdcSEH%2FdJMcagGrMpd%2FAevBCW1rv1odmkK9Weg5X0%2Ftfile.avif&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;910&quot; height=&quot;503&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;나에게 앞으로 나아가는 데 있어 가장 큰 걸림돌은.. 바로.. &lt;b&gt;시작의 두려움과 부족한 용기&lt;/b&gt;라고 생각했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;뭔가 시작하기 두려운 마음이 있고, 도전과 시작을 앞에 두고 겁을 먹었던 것 같다. 내가 이루고자 하는 목표에 다가서기도 전에 도망을 쳤던 것 같기도 하고..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;아직도 뭔가 시도하고 시작하는 것이 두렵지만! 앞으로는 용기 내어 더 많은 것들을 도전해야겠다는 마음을 가져야 된다고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;4) Action Plan &amp;mdash; 책임과 약속, 그리고 마무리 다짐&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7mHBV/dJMcaijTooH/cKbIu1bjbkRjXV8K7WJWA1/tfile.avif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7mHBV/dJMcaijTooH/cKbIu1bjbkRjXV8K7WJWA1/tfile.avif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7mHBV/dJMcaijTooH/cKbIu1bjbkRjXV8K7WJWA1/tfile.avif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7mHBV%2FdJMcaijTooH%2FcKbIu1bjbkRjXV8K7WJWA1%2Ftfile.avif&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;913&quot; height=&quot;515&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;앞으로 이 긴 시간 동안 어떤 마음을 가지고 어떤 태도로 임할 것인지가 결국 중요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;나는 그래도 포기하지 않고 끝까지 열심히 이 시간을 이겨내고 더 나은 나의 모습을 보고 싶다. 그렇기에 힘들더라도 멈추지 않고 끝까지 갈 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;내일 있을 수업 진행에 대해.&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;869&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SLVQb/dJMcafndWk9/kusjHRdgkuhOOIN8KDm3P1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SLVQb/dJMcafndWk9/kusjHRdgkuhOOIN8KDm3P1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SLVQb/dJMcafndWk9/kusjHRdgkuhOOIN8KDm3P1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSLVQb%2FdJMcafndWk9%2FkusjHRdgkuhOOIN8KDm3P1%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;1271&quot; height=&quot;869&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;869&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;이렇게 career tent design 시간이 끝나고, 다음은 내일부터 수업을 진행하시게 될 교수님께서 앞으로 수업이 어떤 방향으로 흘러가고 어떤 걸 배울지 리뷰하는 시간을 가졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;&quot;&gt;앞으로 일정이 두렵지만.. 잘해야겠다는 생각을 든다..&lt;/span&gt;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-sourcepos=&quot;87:1-87:7;2685-2691&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-sourcepos=&quot;89:1-89:131;2693-2823&quot; data-ke-size=&quot;size16&quot;&gt;내일부터는 진짜 수업이 시작된다. 아직 8개월이라는 시간이 아득하게 느껴지고, 미니 프로젝트 같은 부담도 그대로 남아 있지만.. 오늘 trail block에서 스스로 진단했던 대로 &quot;시작의 두려움&quot;에 지지 않고 끝까지 가보려고 한다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;91:1-91:96;2825-2920&quot; data-ke-size=&quot;size16&quot;&gt;매일 이렇게 테크노트를 남기면서 지금의 나를 기록해두고, 8개월 뒤에 돌아봤을 때 얼마나 달라져 있는지 확인해봐야겠다. 그 자체가 완주를 위한 하나의 장치가 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>MLOps엔지니어</category>
      <category>ABC부트캠프</category>
      <category>AI캠퍼스</category>
      <category>AI파일럿</category>
      <category>mlops</category>
      <category>고용노동부</category>
      <category>유클리드소프트</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/36</guid>
      <comments>https://ideas9064.tistory.com/36#entry36comment</comments>
      <pubDate>Sun, 26 Jul 2026 12:52:17 +0900</pubDate>
    </item>
    <item>
      <title>[35일차] 8.15 기술 나눔 활동</title>
      <link>https://ideas9064.tistory.com/35</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오늘은 8월 15일 광복 80주년인데요! &lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;아주 소중하고 기쁜 날입니다!&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;그래서&lt;/b&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오늘!&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인구 소멸 도시인 충북 보은에 도움이 될지는 모르겠지만..&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;도움을 드리고자!&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;보은문화원에 갔습니다.&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;보은에 자라나는 미래들을 위해 이명우 강사님께서 인공지능에 대해 설명하시고 &lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;저와 다른 분들께서 실습하면서 막히는 부분을 도와주는 역할을 했습니다.&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오랜만에 초등학생들의 생각과 목소리를 들으니 &lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;순수했던 초등학생 시절이 생각 나더라고요 &lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그래서인지 저도 즐겁게 참여했던 것 같습니다.&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이렇게 수업이 끝나고&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ABC부트캠프에서 커피와 음료수를 사주셔서 너무 감사했습니다.&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이렇게 마무리 정리하고 나서&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;아주 야무진 쌈밥짐에 가서 맛있는 점심을 먹고&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;복귀했습니다.&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;다시 한 번&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이렇게 좋은 경험을 주신&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ABC부트캠프에 감사합니다!&lt;/b&gt;&lt;/h3&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignRight&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;008&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/008.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/008.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ABC부트캠프</category>
      <category>ABC부트캠프</category>
      <category>고용노동부</category>
      <category>대한상공회의소</category>
      <category>미래내일일경험</category>
      <category>유클리드소프트</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/35</guid>
      <comments>https://ideas9064.tistory.com/35#entry35comment</comments>
      <pubDate>Sun, 17 Aug 2025 18:17:23 +0900</pubDate>
    </item>
    <item>
      <title>[34일차]ABC부트캠프</title>
      <link>https://ideas9064.tistory.com/34</link>
      <description>&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오늘 성과 발표회가 있었습니다.&lt;/b&gt;&lt;/h4&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;어우.. 모든 조들이 너무 훌륭하게 준비하고 발표해서 대단했다는 생각이 드네요...&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이렇게 짧은 시간동안 정말 완성도 높은 결과물을 내놓을 수 있다는게 말이 안되네요..&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;물론 우리 조도 매우 잘했다고 생각합니다!&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그동안 준비해왔던 것을 남들에게 발표하고 소개할 수 있어서 속이 너무 시원했던 것 같습니다.&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;힘들고 열심히 준비해왔던 만큼&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이번 경험은 죽을 때까지 기억에 남을 것 같네요.&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이런 경험을 할 수 있게 기회를 주신 유클리드소프트 관계자 여러분들께 감사드립니다.&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;다들 수고하셨습니다!&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;text-align: center;&quot; 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;</description>
      <category>ABC부트캠프</category>
      <category>고용노동부</category>
      <category>대한상공회의소</category>
      <category>미래내일일경험</category>
      <category>유클리드소프트</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/34</guid>
      <comments>https://ideas9064.tistory.com/34#entry34comment</comments>
      <pubDate>Sun, 17 Aug 2025 18:16:55 +0900</pubDate>
    </item>
    <item>
      <title>[33일차]ABC부트캠프</title>
      <link>https://ideas9064.tistory.com/33</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;이젠 모든 자료를 4시까지 제출하고 &lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;내일!&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;저희 결과물이 세상에 알리는 날이 옵니다.&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;너무 타이트한 시간으로 발표를 준비해야해서 완성도는 높지 못하지만 그래도&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;재미있는 시간이었던 것 같습니다.&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가장 떨리는 건 우리 조의 발표자 분이 아닐까 싶습니다.&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;많은 사람들 앞에서 발표를 해야하는데&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;제가 더 긴장이 되네여&lt;/b&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;내일 좋은 성과가 있었으면 하네요 화이팅!&lt;/b&gt;&lt;/h4&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;032&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/032.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/032.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ABC부트캠프</category>
      <category>ABC부트캠프</category>
      <category>고용노동부</category>
      <category>대한상공회의소</category>
      <category>미래내일일경험</category>
      <category>유클리드소프트</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/33</guid>
      <comments>https://ideas9064.tistory.com/33#entry33comment</comments>
      <pubDate>Sun, 17 Aug 2025 18:16:39 +0900</pubDate>
    </item>
    <item>
      <title>[32일차]ABC부트캠프</title>
      <link>https://ideas9064.tistory.com/32</link>
      <description>&lt;p style=&quot;text-align: center;&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;갑작스레 replit을 사용할 수 없게 되어 코드를 옮겨서 다시 작업을 이어 가야 했습니다ㅠㅠ&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;021&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;오늘은 부실했던 PPT내용을 채우기위해 자료를 다시 모아 정리하고 &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;PPT내용을 잘 채웠던 것 같습니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;근데 문제는 바이브 코딩으로 작업하다보니... &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;vs code로 옮겨도 잘 해결되지 않아서 클났습니다;;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;그리고 시간은 왜이리 빠른지 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;벌써 하루가 끝나가고 발표까지 2일 남은게 말이 안되네여...&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;오늘 하루도 수고한 우리 팀원들&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif;&quot;&gt;&lt;b&gt;좋은 결과가 있었으면 좋겠네요.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;025&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/025.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/025.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ABC부트캠프</category>
      <category>ABC부트캠프</category>
      <category>고용노동부</category>
      <category>대한상공회의소</category>
      <category>미래내일일경험</category>
      <category>유클리드소프트</category>
      <author>ideas9064</author>
      <guid isPermaLink="true">https://ideas9064.tistory.com/32</guid>
      <comments>https://ideas9064.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 17 Aug 2025 18:16:25 +0900</pubDate>
    </item>
  </channel>
</rss>