<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Steady Study Log</title>
    <link>https://dreamyhand.tistory.com/</link>
    <description>Petit &amp;agrave; petit l'oiseau fait son nid.</description>
    <language>ko</language>
    <pubDate>Wed, 8 Apr 2026 06:05:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>J. Son</managingEditor>
    <image>
      <title>Steady Study Log</title>
      <url>https://tistory1.daumcdn.net/tistory/4647371/attach/f58ef8e383ad4ec784dad728eaa2f998</url>
      <link>https://dreamyhand.tistory.com</link>
    </image>
    <item>
      <title>[ML] 상품명 기반 군집화: TF-IDF와 KMeans로 제품 카테고리 자동 분류하기</title>
      <link>https://dreamyhand.tistory.com/364</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;텍스트 데이터는 구조화되어 있지 않기 때문에 분석이 어렵다고 느껴질 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;이번 포스팅에서는 수업 중 연습문제로 내주신 상품명을 기반으로 유사한 제품들을 자동으로 묶는 '군집화(clustering)' 과정을 단계별로 정리해보고자 한다.&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: 'Nanum Gothic';&quot;&gt;특히 TF-IDF와 KMeans를 활용하여 제품 카테고리가 어떻게 자연스럽게 분리되는지 확인해본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터 로드 및 기본 탐색&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775520997410&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 먼저 UCI에서 제공하는 상품 데이터를 불러온다. 이 데이터에는 다양한 상품명(Product Title)이 포함되어 있다.
import pandas as pd

df = pd.read_csv('pricerunner_aggregate.csv')

print(df['Product Title'].head())
# 데이터를 확인한 뒤, 상품명이 없는 경우는 분석에 사용할 수 없으므로 제거한다.
df = df.dropna(subset=['Product Title'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;텍스트 전처리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상품명은 다양한 기호와 대소문자가 섞여 있기 때문에, 모델이 이해하기 쉬운 형태로 정제하는 과정이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;핵심은 소문자로 변환, 알파벳과 숫자를 제외한 문자 제거이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775521105504&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import re 

def clean_text(text): 
	text = text.lower() 
    text = re.sub(r'[^a-z0-9 ]', '', text) 
    return text 
    
df['clean_title'] = df['Product Title'].apply(clean_text) 

print(df[['Product Title', 'clean_title']].head())&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: 'Nanum Gothic';&quot;&gt;이 과정을 거치면 &quot;Apple iPhone 14(128GB)!&quot; 같은 텍스트가 &quot;apple iphone 14 128gb&quot; 형태로 정리된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TF-IDF 벡터화&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 텍스트를 숫자로 변환한다. 단순히 단어 개수를 세는 방식이 아니라, 각 단어의 중요도를 반영하는 TF-IDF를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775521218190&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.feature_extraction.text import TfidfVectorizer 

vectorizer = TfidfVectorizer(stop_words='english', max_features=1000) 
X = vectorizer.fit_transform(df['clean_title']) 

print(&quot;TF-IDF shape:&quot;, X.shape)&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: 'Nanum Gothic';&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: 'Nanum Gothic';&quot;&gt;stop_words='english': 의미 없는 단어 제거&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;max_features=1000: 중요한 단어만 사용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;즉, 모델이 핵심 단어에 집중하도록 만드는 과정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최적 클러스터 수 찾기 (Silhouette Score)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;군집화에서 가장 중요한 질문은 &quot;몇 개로 나눌 것인가&quot;이다. 이를 위해 Silhouette Score를 사용한다.&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: 'Nanum Gothic';&quot;&gt;Silhouette Score는 -1 부터 1 사이의 값을 가지며, 값이 클수록 군집이 잘 나뉘었다는 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775521392976&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.cluster import KMeans 
from sklearn.metrics import silhouette_score 

scores = [] 
K_range = range(2, 11) 

for k in K_range: 
	kmeans = KMeans(n_clusters=k, random_state=42) 
    labels = kmeans.fit_predict(X) 
    
    score = silhouette_score(X, labels) 
    scores.append(score) 
    
    print(f&quot;K={k}, Silhouette Score={score:.4f}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 결과를 시각화하면 최적의 K를 직관적으로 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775521442828&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt 

plt.figure() 
plt.plot(K_range, scores, marker='o') 
plt.xlabel('Number of Clusters (K)') 
plt.ylabel('Silhouette Score') 
plt.title('Silhouette Score vs K') 
plt.show()&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: 'Nanum Gothic';&quot;&gt;보통 가장 높은 점수를 가지는 K를 선택하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MIm8U/dJMcabKyrwd/yQm8NkW0JPiGNJlA3HWgT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MIm8U/dJMcabKyrwd/yQm8NkW0JPiGNJlA3HWgT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MIm8U/dJMcabKyrwd/yQm8NkW0JPiGNJlA3HWgT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMIm8U%2FdJMcabKyrwd%2FyQm8NkW0JPiGNJlA3HWgT0%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;685&quot; height=&quot;378&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;KMeans 클러스터링 수행&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;선택한 K값을 기반으로 실제 군집화를 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775521515756&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np 

optimal_k = K_range[np.argmax(scores)] 
print(&quot;Optimal K:&quot;, optimal_k) 

kmeans = KMeans(n_clusters=optimal_k, random_state=42) 
df['cluster'] = kmeans.fit_predict(X) 

print(df[['clean_title', 'cluster']].head())&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: 'Nanum Gothic';&quot;&gt;이제 각 상품은 특정 클러스터에 속하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;PCA를 활용한 2차원 시각화&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;고차원 벡터는 눈으로 확인하기 어렵기 때문에, PCA를 사용해 2차원으로 축소하여 시각화한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775521625729&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.decomposition import PCA 

pca = PCA(n_components=2) 
X_pca = pca.fit_transform(X.toarray()) 

plt.figure() 

for cluster in range(optimal_k): 
	plt.scatter( X_pca[df['cluster'] == cluster, 0], 
    X_pca[df['cluster'] == cluster, 1], 
    label=f'Cluster {cluster}' 
) 

plt.xlabel('PCA 1') 
plt.ylabel('PCA 2') 
plt.title('PCA Visualization of Clusters') 
plt.legend() 
plt.show()&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: 'Nanum Gothic';&quot;&gt;이 그래프를 보면 비슷한 상품들이 자연스럽게 모여 있는 것을 확인할 수 있다.&amp;nbsp;&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;858&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4hgwK/dJMcaco78jM/TZB3M40b0KExyHlqJurbv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4hgwK/dJMcaco78jM/TZB3M40b0KExyHlqJurbv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4hgwK/dJMcaco78jM/TZB3M40b0KExyHlqJurbv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4hgwK%2FdJMcaco78jM%2FTZB3M40b0KExyHlqJurbv1%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;730&quot; height=&quot;464&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;결과 해석&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&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: 'Nanum Gothic';&quot;&gt;스마트폰 관련 제품&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;노트북 및 컴퓨터&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;오디오 기기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&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: 'Nanum Gothic';&quot;&gt;즉, 모델이 별도의 라벨 없이도 상품 카테고리를 자동으로 구분하고 있는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;한 단계 더 나아가기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;* 클러스터링 라벨링: 각 클러스터에 의미를 부여하면 추천시스템, 상품 분류 자동화 같은 실제 서비스로 확장할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마무리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;핵심은 3가지 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1) 텍스트 전처리로 노이즈 제거&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2) TF-IDF로 단어 중요도 반영&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3) KMeans로 유사한 상품 자동 그룹화&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: 'Nanum Gothic';&quot;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL</category>
      <category>kmeans</category>
      <category>PCA</category>
      <category>Silhouette Score</category>
      <category>TF-IDF</category>
      <category>클러스터</category>
      <category>텍스트 전처리</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/364</guid>
      <comments>https://dreamyhand.tistory.com/364#entry364comment</comments>
      <pubDate>Tue, 7 Apr 2026 09:33:23 +0900</pubDate>
    </item>
    <item>
      <title>[ML] 스마트폰 센서 데이터로 사용자 행동 분류하기: HAR 다중분류 실습</title>
      <link>https://dreamyhand.tistory.com/362</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터 다운로드:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/datasets/uciml/human-activity-recognition-with-smartphones&quot;&gt;https://www.kaggle.com/datasets/uciml/human-activity-recognition-with-smartphones&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1775213261623&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Human Activity Recognition with Smartphones&quot; data-og-description=&quot;Recordings of 30 study participants performing activities of daily living&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/datasets/uciml/human-activity-recognition-with-smartphones&quot; data-og-url=&quot;https://www.kaggle.com/datasets/uciml/human-activity-recognition-with-smartphones&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pi6HA/dJMb8Z3rKpN/khjb02uQarkdyPgSXiFEr0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/nVeha/dJMb8XR57zw/IwJT7mRokkXJBMSDuI2qq0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/datasets/uciml/human-activity-recognition-with-smartphones&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/datasets/uciml/human-activity-recognition-with-smartphones&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pi6HA/dJMb8Z3rKpN/khjb02uQarkdyPgSXiFEr0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/nVeha/dJMb8XR57zw/IwJT7mRokkXJBMSDuI2qq0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Human Activity Recognition with Smartphones&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Recordings of 30 study participants performing activities of daily living&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 문제 소개: 사용자 행동 인식이란&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사용자 행동 인식(Human Activity Recognition, HAR)은 스마트폰이나 웨어러블 기기의 센서 데이터를 바탕으로 사람이 어떤 행동을 하고 있는지 분류하는 문제이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;이번 실습에서는 스마트폰 센서 기반 데이터를 이용해 여러 머신러닝 분류 모델을 비교하고, 하이퍼파라미터 튜닝을 통해 최종적으로 가장 적합한 모델을 찾는 과정을 정리해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 데이터셋 구조 살펴보기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에 사용한 데이터는 Kaggle에 공개된 Human Activity Recognition with Smartphone 데이터셋이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;또한 데이터에는 &lt;code&gt;subject&lt;/code&gt; 컬럼이 포함되어 있는데, 이는 사람 ID에 해당한다. 이 값을 그대로 입력 변수에 포함하면 모델이 행동 패턴이 아니라 특정 살마의 특성을 학습할 수 있으므로, 이번 실습에서는 데이터 누수를 방지하기 위해 제거하고 학습을 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 전처리와 학습 데이터 준비&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;전처리 단계에서는 다음 과정을 수행했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;code&gt;Activity&lt;/code&gt; 컬럼을 타깃값으로 분리하고, &lt;code&gt;subject&lt;/code&gt; 컬럼은 제거했다. 이후 활동 라벨은 모델 학습을 위해 숫자형으로 인코딩했다. 또한 SVM, Logistic Regression, KNN 처럼 입력 스케일의 영향을 많이 받는 모델에는 &lt;code&gt;StandardScaler&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: 'Nanum Gothic';&quot;&gt;이 과정에서 다시 한 번 느낀 점은, 모든 모델에 똑같은 전처리를 적용하는 것이 아니라 '&lt;u&gt;모델 특성에 맞는 전처리&lt;/u&gt;'가 중요하다는 점이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 비교할 분류 모델 선정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&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: 'Nanum Gothic';&quot;&gt;Logistic Regression&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Random Forest&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;XGBoost&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LightGBM&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;SVM (RBF)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;KNN&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Logistic Regression은 베이직라인 역할을 하고, Random Forest는 트리 기반 모델의 대표적인 예시이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;XGBoost와 LightGBM은 성능이 강력한 부스팅 계열 모델이며, SVM은 고차원 데이터에서 자주 강한 성능을 보이는 대표적인 분류기이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;KNN은 거리 기반 모델 비교를 위해 함께 넣었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. 평가 지표 정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다중분류 문제에서는 Accuracy만 보는 것이 부족하다. 그래서 이번 실습에서는 Accuracy, Precision, Recall, F1-score, AUC를 함께 비교했다.&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: 'Nanum Gothic';&quot;&gt;Accuracy는 전체 정답률이고, Precision은 예측의 신뢰도, Recall은 실제 정답을 얼마나 잘 찾아냈는지를 보여준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;F1-score는 Precision과 Recall의 균형을 나타내는 지표이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;AUC는 Area Under the Curve의 약자로, 모델이 클래스 간 구분을 얼마나 잘하는지를 보여준다.&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: 'Nanum Gothic';&quot;&gt;즉, Accuracy는 &quot;얼마나 많이 맞췄는가&quot;이고, AUC는 &quot;얼마나 잘 구분하는가&quot;라고 이해하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;6. 베이스라인 모델 성능 비교&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;베이스라인 비교 결과에서는 Linear SVM과 Logistic Regression이 꽤 높은 성능을 보였다. 이는 데이터가 이미 잘 정제된 수치형 특징으로 이루어져 있어서, 복잡한 비선형 모델이 아니더라도 좋은 분류 결과를 낼 수 있었기 때문이라고 해석할 수 있다.&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: 'Nanum Gothic';&quot;&gt;반면 KNN은 상대적으로 낮은 성능을 보였는데, 이는 특징 수가 많고 거리 계산의 영향을 크게 받는 데이터 구조 때문으로 볼 수 있다.&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: 'Nanum Gothic';&quot;&gt;이 단계에서 인상적이었던 점은 &quot;복잡한 모델이 무조건 더 좋다&quot;는 것이 아니라, &lt;u&gt;데이터 구조가 모델 성능을 크게 좌우한다&lt;/u&gt;는 사실이었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;7. 하이퍼파라미터 튜닝 과정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;베이스라인 결과와 모델 특성을 고려해 XGBoost, LightGBM, SVM(RBF)을 중심으로 하이퍼파라미터 튜닝을 진행했다. 튜닝은 &lt;code&gt;RandomizedSearchCV&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: 'Nanum Gothic';&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: 'Nanum Gothic';&quot;&gt;LightGBM: 0.9937&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;XGBoost: 0.9894&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;SVM(RBF): 0.9861&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 결과만 보면 LightGBM이 가장 좋아 보인다. 하지만 모델 선택은 여기서 끝나지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;교차검증 성능이 높더라도, 최종 테스트셋에서의 일반화 성능이 다르게 나타날 수 있기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;8. 최종 모델 선정 결과 해석&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최종 테스트셋에서 튜닝 모델들의 성능을 비교한 결과는 다음과 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 72px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 21.782947%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;모델명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.457364%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Accuracy&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.31783%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Precision&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.968991%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Recall&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.43411%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;F1-score&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.03876%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;AUC&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 21.782947%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Best SVM (RBF)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.457364%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9566&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.31783%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9574&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.968991%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9566&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.43411%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9564&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.03876%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9977&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 21.782947%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Best LightGBM&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.457364%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9427&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.31783%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9437&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.968991%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9427&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.43411%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9425&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.03876%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9975&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 21.782947%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Best XGBoost&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.457364%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9413&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.31783%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9425&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.968991%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9413&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.43411%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9411&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.03876%; text-align: center; height: 18px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;0.9974&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;결과적으로 최종 우승 모델은 &lt;b&gt;SVM(RBF)&lt;/b&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: 'Nanum Gothic';&quot;&gt;흥미로운 점은 교차검증에서는 LightGBM이 1등이었지만 테스트셋에서는 SVM(RBF)이 더 높은 Accuracy, F1-score, AUC를 기록했다는 점이다. 이는 모델 선택 시 교차검증 결과만 보는 것이 아니라, 반드시 최종 테스트셋 결과까지 함께 확인해야 한다는 점을 잘 보여준다.&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: 'Nanum Gothic';&quot;&gt;또한 베이스라인에서 Linear SVM이 강했고, 최종적으로는 RBF SVM이 1등이 되었다는 점을 보면, 이번 HAR 데이터는 매우 복잡한 트리 앙상블보다도 커널 기반 경계 설정이 잘 맞는 구조였다고 해석할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;9. 느낀 점 및 한계&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;첫째, 잘 정제된 특징 기반 데이터에서는 전통적인 머신러닝 모델이 여전히 매우 강력하다는 점이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;둘째, Accuracy만 보는 것이 아니라 F1-score와 AUC까지 함께 봐야 모델을 제대로 평가할 수 있다는 점이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;셋째, 교차검증 1등 모델이 최종 테스트셋 1등 모델과 다를 수 있기 때문에, 모델 선택은 반드시 최종 평가까지 마쳐야 한다는 점이다.&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: 'Nanum Gothic';&quot;&gt;다만 이번 실습은 주어진 train/test 분할을 기준으로 진행한 것이므로, 더 엄밀하게는 subject 단위 일반화 성능을 따로 검토해 볼 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;또한 confusion matrix를 통해 어떤 행동 클래스끼리 혼동되는지도 추가로 분석하면 더 깊이 있는 해석이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10. 전체 코드 및 마무리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;전체 코드는 GitHub의 05_machine_learning &amp;gt; 06_ensenble &amp;gt; practice &amp;gt; practice.ipynb 파일에 정리해두었고, 데이터는 &amp;nbsp;포스팅 상단의 Kaggle 링크를 통해 내려받아 동일하게 실습할 수 있다.&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: 'Nanum Gothic';&quot;&gt;이번 실습은 단순히 모델 정확도만 비교하는 연습이 아니라,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[ 데이터 이해 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; 전처리 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; 모델 비교 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; 하이퍼파라미터 튜닝 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;rarr; 최종 해석 ]이라는 머신러닝 전체 흐름을 정리하는 좋은 경험이었다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&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: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;caret-color: #000000;&quot;&gt;특히 이번 결과를 통해, 최신 부스팅 모델이 항상 정답은 아니며 데이터 구조에 따라 SVM 같은 전통적인 모델이 더 뛰어난 결과를 낼 수도 있다는 점을 확인할 수 있었다.&lt;/span&gt;&lt;/span&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;color: #9d9d9d; font-family: 'Nanum Gothic';&quot;&gt;* 본 분석은 생성형 AI 중 저와 잘 맞는 chatGPT와 함께 학습했습니다.&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;</description>
      <category>ML &amp;amp; DL</category>
      <category>HAR</category>
      <category>Kaggle</category>
      <category>machine learning</category>
      <category>Python</category>
      <category>데이터</category>
      <category>머신러닝</category>
      <category>머신러닝 해석</category>
      <category>모델 비교</category>
      <category>전처리</category>
      <category>하이퍼파라미터 튜닝</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/362</guid>
      <comments>https://dreamyhand.tistory.com/362#entry362comment</comments>
      <pubDate>Sun, 5 Apr 2026 07:55:52 +0900</pubDate>
    </item>
    <item>
      <title>[GitHub] 노트북 두고 온 날 유용했던 팁: 아이폰 Safari로 GitHub 업로드 하기(.gitkeep)</title>
      <link>https://dreamyhand.tistory.com/363</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;며칠 전, 크롤링을 계속 켜두느라고 아이패드와 아이폰만 가지고 집을 나선 적이 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래서 처음에는 동기 분들께 노트북을 잠시 빌려야 할 상황에 대해 양해를 구했었지만, 결국 Safari에서 GitHub에 접속하여 파일 업로드에 성공했다.&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: 'Nanum Gothic';&quot;&gt;모바일 깃허브 앱도 있지만, Safari에서 웹에 접속하는 방식이 더 잘 맞았고, 실제로 빈 폴더 생성을 위한 &lt;code&gt;.gitkeep&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: 'Nanum Gothic';&quot;&gt;(내가 안드로이드 폰으로 확인해본 것은 아니지만) 꼭 아이폰이 아니더라도 모바일 인터넷을 통해 같은 기능을 사용할 수 있으리라 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Safari로 GitHub 웹에 들어가면 의외로 할 수 있는 것들&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대표적으로 아래와 같은 것들이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;README 수정, 간단한 오타 수정, 새 파일 생성, 링크 추가, 폴더 구조 정리, 메모성 문서 추가, 그리고 빈 폴더 생성(.gitkeep) 같은 작업이다.&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: 'Nanum Gothic';&quot;&gt;즉, 개발 자체보다는 관리와 정리 성격의 작업은 모바일이 더 편리할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;노트북이 없는 날은 억지로 무거운 코딩을 하기보다, 스마트폰으로 할 수 있는 범위 안에서 처리하는 편이 마음이 가벼울 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;왜 .gitkeep이 필요한가&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 부분은 GitHub를 처음 쓸 때 헷갈리기 쉬운 지점이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우리가 첫 번째 팀 프로젝트를 할 때에도 아리송했던 부분이다. 많은 사람들이 &quot;(로컬에서처럼) 새 폴더를 만들면 되는 것 아닌가?&quot;라고 생각하는데, GitHub는 빈 폴더를 그대로 유지하지 않는다.&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: 'Nanum Gothic';&quot;&gt;예를 들어 data/raw/ 라는 폴더를 미리 만들어두고 싶다고 해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그런데 그 안에 아직 아무 파일도 없다면, GitHub에서는 그 폴더가 유지되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;그래서 자주 쓰는 방법이 .gitkeep 파일이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;예를 들어 data/raw/.gitkeep 파일을 하나 넣어두면, GitHub는 그 경로를 인식해서 폴더 구조를 유지한다.&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: 'Nanum Gothic';&quot;&gt;정확히 말하면 .gitkeep 은 Git의 공식 기능이라기보다,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&quot;이 폴더는 지금 비어 있지만 유지하고 싶다&quot;는 뜻으로 많이 쓰는 관례적인 파일 이름이라고 이해하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사용법 설명&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우측 상단의 ...을 누르고 + Create new file 을 클릭한 후, &lt;b&gt;폴더이름/.gitkeep&lt;/b&gt; 을 입력하면 된다. 예시에서는 eda/.gitkeep 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0647.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diEAkG/dJMcadnX5bg/Sx9vjrKc5zjXl9CTo1eADK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diEAkG/dJMcadnX5bg/Sx9vjrKc5zjXl9CTo1eADK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diEAkG/dJMcadnX5bg/Sx9vjrKc5zjXl9CTo1eADK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiEAkG%2FdJMcadnX5bg%2FSx9vjrKc5zjXl9CTo1eADK%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;506&quot; height=&quot;1100&quot; data-filename=&quot;IMG_0647.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_0648.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTbobx/dJMcah41aAC/cXfTKwyK9szyx3RW3B8Cy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTbobx/dJMcah41aAC/cXfTKwyK9szyx3RW3B8Cy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTbobx/dJMcah41aAC/cXfTKwyK9szyx3RW3B8Cy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTbobx%2FdJMcah41aAC%2FcXfTKwyK9szyx3RW3B8Cy0%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;513&quot; height=&quot;1115&quot; data-filename=&quot;IMG_0648.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;2622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python &amp;amp; SQL/Git &amp;amp; GitHub</category>
      <category>github iphone</category>
      <category>github safari</category>
      <category>아이폰 깃허브</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/363</guid>
      <comments>https://dreamyhand.tistory.com/363#entry363comment</comments>
      <pubDate>Fri, 3 Apr 2026 20:43:59 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝을 한 단계 더 이해하기</title>
      <link>https://dreamyhand.tistory.com/357</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;교차검증, 하이퍼파라미터 튜닝 그리고 비지도학습&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;머신러닝을 처음 공부할 때는 데이터를 나누고, 모델을 만들고, 정확도를 확인하는 과정 자체만으로도 충분히 새롭고 어렵게 느껴진다. 그런데 몇 번 반복하다 보면 비슷한 고민이 생기기 시작한다. &quot;이 모델이 진짜 잘 만든 모델일까?&quot;, &quot;이 결과를 그대로 믿어도 될까?&quot; 같은 질문이다.&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: 'Nanum Gothic';&quot;&gt;나 역시 간단한 모델을 만들어보고 정확도를 확인했을 때는 결과가 꽤 괜찮게 나와서 만족했던 적이 있다. 그런데 데이터를 나누는 방식을 조금 바꾸거나, 같은 모델을 다시 돌려보면 결과가 미묘하게 달라지는 것을 보게 된다. 이때부터 &quot;모델을 한 번만 평가하는 것이 과연 충분한가&quot;라는 의문을 가지게 된다.&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: 'Nanum Gothic';&quot;&gt;이런 고민에서 등장하는 &lt;b&gt;개념이 바로 교차검증(cross-validation)&lt;/b&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;교차 검증을 이해하면서 자연스럽게 이어지는 개념이 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;머신러닝 모델에는 두 가지 종류의 값이 있다. 하나는 데이터를 통해 학습되는 값이고, 다른 하나는 사람이 직접 설정해줘야 하는 값이다. 예를 들어 K-NN에서 K 값, 결정트리의 깊이, 리지 회귀의 규제 강도 같은 것들이 여기에 해당한다. 이런 값들을 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;처음에는 이 값들을 대충 정해서 모델을 돌렸는데, 값을 조금만 바꿔도 결과가 달라지는 것을 보면서 중요성을 느끼게 되었다. 결국 모델 성능은 알고리즘 선택뿐만 아니라, &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;이쯤 되면 머신러닝의 흐름이 어느 정도 잡힌다. 데이터를 준비하고, 전처리하고, 모델을 선택하고, 성능을 평가하고, 파라미터를 조정하는 과정이 하나의 사이클처럼 연결된다. 그런데 여기까지는 모두 공통된 특징이 하나 있다. 바로&lt;b&gt; 정답이 있는 데이터&lt;/b&gt;를 사용한다는 점이다.&amp;nbsp;&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: 'Nanum Gothic';&quot;&gt;이제 여기서 한 걸음 더 나아가면, 정답이 없는 데이터는 어떻게 다룰 수 있을까라는 질문이 생긴다. 이 질문에서 출발하는 것이&lt;b&gt; 비지도학습(unsupervised learning)&lt;/b&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;대표적인 예가 &lt;b&gt;군집화(clustering)&lt;/b&gt;이다. 군집화는 비슷한 데이터끼리 묶는 작업이다. 예를 들어 고객 데이터를 기반으로 비슷한 소비 패턴을 가진 그룹을 나누는 것이다. 이때 많이 사용하는 알고리즘이 &lt;b&gt;K-means&lt;/b&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: 'Nanum Gothic';&quot;&gt;처음 이 개념을 접했을 때는 &quot;정답이 없는데 어떻게 학습을 하지?&quot;라는 생각이 들었다. 하지만 관점을 바꿔보면, 비지도학습은 &quot;예측&quot;보다는 &quot;구조를 이해하는 것&quot;에 가깝다. 즉, 결과를 맞추는 것이 아니라 데이터를 해석하는 과정이다.&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: 'Nanum Gothic';&quot;&gt;또 다른 중요한 개념은 &lt;b&gt;차원 축소&lt;/b&gt;이다. 데이터가 너무 많은 변수로 이루어져 있을 때, 이를 더 적은 차원으로 줄이는 방법이다. 대표적으로 PCA 같은 기법이 있다. 차원을 줄이면 데이터를 시각화하기 쉬워지고, 모델의 성능이 좋아지는 경우도 있다.&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: 'Nanum Gothic';&quot;&gt;여기까지 오면서 느낀 점은 머신러닝이 단순히 모델을 돌리는 기술이 아니라는 것이다. 데이터를 이해하고, 적절한 방법을 선택하고, 결과를 해석하는 전체 과정이 모두 포함되어 있다.&amp;nbsp;&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: 'Nanum Gothic';&quot;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL</category>
      <category>k-means</category>
      <category>machine learning</category>
      <category>교차검증</category>
      <category>군집화</category>
      <category>머신러닝</category>
      <category>비지도학습</category>
      <category>지도학습</category>
      <category>차원 축소</category>
      <category>하이퍼파라미터 튜닝</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/357</guid>
      <comments>https://dreamyhand.tistory.com/357#entry357comment</comments>
      <pubDate>Sun, 29 Mar 2026 14:20:10 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 성능을 바꾸는 핵심 요소</title>
      <link>https://dreamyhand.tistory.com/356</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;전처리, 스케일링, 특성공학과 성능 평가&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;머신러닝을 처음 공부할 때는 어떤 알고리즘을 사용하는지가 가장 중요해 보였다. k-NN, 선형회귀, 랜덤 포레스트 같은 모델 이름들이 계속 나오다보니, 어떤 모델을 선택하느냐가 성능을 결정한다고 생각하기 쉬웠다. 그런데 공부를 조금 진행해보니 생각보다 다른 부분에서 막히게 된다. 바로 데이터를 다루는 과정이다.&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: 'Nanum Gothic';&quot;&gt;실제로 모델을 적용해보면, 데이터가 깔끔하게 정리되어 있는 경우는 거의 없다. 값이 비어 있기도 하고, 숫자가 아닌 문자열이 섞여 있기도 하고, 변수마다 값의 크기가 크게 다른 경우도 많다. 이런 상태에서는 모델을 제대로 적용하기 어렵다. 그래서 머신러닝에서는 모델 이전 단계인 &lt;b&gt;데이터 전처리 과정&lt;/b&gt;이 중요하다는 말을 많이 듣게 된다.&amp;nbsp;&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: 'Nanum Gothic';&quot;&gt;가장 먼저 마주하게 되는 문제는 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;방법은 여러 가지가 있다. 결측치가 있는 행을 아예 제거할 수도 있고, 평균값이나 중앙값으로 채울 수도 있다. 경우에 따라서는 결측 여부 자체를 하나의 정보로 활용하기도 한단다. 중요한 것은 &quot;이게 정답이다&quot;라는 방식이 있는 것이 아니라, 데이터 상황에 맞게 선택해야 한다는 점이다.&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: 'Nanum Gothic';&quot;&gt;그 다음으로 헷갈렸던 부분은 &lt;b&gt;범주형 변수 처리&lt;/b&gt;이다. 예를 들어 &quot;서울&quot;, &quot;부산&quot;, &quot;대전&quot; 같은 값들은 사람이 보기에는 이해가 쉽지만, 모델은 이런 문자열을 그대로 이해하지 못한다. 그래서 숫자로 바꿔줘야 한다는 개념을 처음 접하게 된다.&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: 'Nanum Gothic';&quot;&gt;이때 사용하는 방법이 &lt;b&gt;원-핫 인코딩&lt;/b&gt;이다. 하나의 값을 여러개의 0과 1로 나누어 표현하는 방식이다. 처음에는 왜 이렇게까지 해야 하는지 잘 이해가 되지 않았는데, 모델 입장에서는 각 범주를 독립적인 값으로 보는 것이 중요하다는 것을 알게 되었다.&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: 'Nanum Gothic';&quot;&gt;또 하나 인상적이었던 부분은 &lt;b&gt;스케일링&lt;/b&gt;이다. 변수마다 값의 크기가 다르면 모델이 특정 변수에 더 크게 영향을 받는다는 점이다. 예를 들어 어떤 변수는 1~10 사이인데, 다른 변수는 1,000~100,000이라면, 자연스럽게 큰 값을 가진 변수 쪽으로 모델이 치우치게 된다.&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: 'Nanum Gothic';&quot;&gt;특히 K-NN처럼 거리 기반으로 계산하는 모델에서는 이 영향이 매우 크게 나타난다. 그래서 값을 일정한 기준으로 맞추는 과정이 필요하다는 것을 이해하게 되었다. 대표적인 방법으로는 평균을 기준으로 맞추는 표준화나 0~1 사이로 줄이는 정규화가 있다. 이 개념은 단순해 보이지만 실제로 결과에 영향을 주는 부분이라 인상 깊었다.&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: 'Nanum Gothic';&quot;&gt;이 과정을 공부하면서 새로 알게 된 개념이 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;예를 들어 날짜 데이터가 있으면 그냥 날짜로 두는 것이 아니라, &quot;월&quot;, &quot;요일&quot;, &quot;주말 여부&quot; 같은 변수로 나누어 사용할 수 있다. 고객 데이터라면 단순한 정보 외에도 &quot;최근 구매 시점&quot; 같은 변수를 추가할 수도 있다. 이런 과정이 모델 성능에 영향을 줄 수 있다는 점이 흥미로웠다.&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: 'Nanum Gothic';&quot;&gt;머신러닝을 공부하면서 또 하나 헷갈렸던 부분은 &lt;b&gt;모델 평가&lt;/b&gt;이다. 처음에는 단순히 정확도 하나만 보면 되는 줄 알았다. 예를 들어 90% 정확도라는 결과를 보면 좋은 모델이라고 생각했었다.&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: 'Nanum Gothic';&quot;&gt;그런데 데이터를 조금 더 살펴보니, 정확도만으로는 부족하다는 것을 알게 되었다. 예를 들어 대부분이 &quot;정상&quot;이고 일부만 &quot;이상&quot;인 데이터에서는, 모델이 모든 데이터를 &quot;정상&quot;이라고 예측해도 높은 정확도가 나올 수 있다. 이런 경우에는 실제로 중요한 부분을 전혀 맞추지 못한 것이다.&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: 'Nanum Gothic';&quot;&gt;그래서 등장하는 개념이 &lt;b&gt;정밀도와 재현율&lt;/b&gt;이다. 정밀도는 모델이 맞다고 판단한 것 중 실제로 맞은 비율이고, 재현율은 실제로 맞는 것 중 모델이 얼마나 잘 찾아냈는지를 의미한다. 청므에는 이 두 개념이 헷갈렸지만, &quot;얼마나 정확하게 맞췄는가&quot;와 &quot;얼마나 놓치지 않았는가&quot;로 나누어 생각하니 이해가 조금 쉬워졌다.&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: 'Nanum Gothic';&quot;&gt;이 둘을 함께 고려한 지표가 &lt;b&gt;F1-score&lt;/b&gt;이다. 또한 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;회귀 문제에서는 또 다른 방식으로 평가를 하게 된다. 예측값과 실제값 사이의 차이를 기준으로 평가하는데, MAE나 MSE 같은 지표를 사용한다. 이 부분도 처음에는 복잡하게 느껴졌지만, 결국 &quot;얼마나 틀렸는지를 측정하는 방법&quot;이라고 이해하면 된다.&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: 'Nanum Gothic';&quot;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL</category>
      <category>machine learning</category>
      <category>머신러닝</category>
      <category>모델평가</category>
      <category>스케일링</category>
      <category>원핫 인코딩</category>
      <category>재현율</category>
      <category>정밀도</category>
      <category>특성공학</category>
      <category>혼동행렬</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/356</guid>
      <comments>https://dreamyhand.tistory.com/356#entry356comment</comments>
      <pubDate>Sun, 29 Mar 2026 14:05:37 +0900</pubDate>
    </item>
    <item>
      <title>지도학습 핵심 개념과 대표 알고리즘</title>
      <link>https://dreamyhand.tistory.com/355</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분류와 회귀부터 과대적합까지 한 번에 이해하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;머신러닝을 처음 배우면 다양한 알고리즘 이름이 쏟아진다. K-NN, 선형회귀, 로지스틱 회귀, SVM, 결정트리 등 익숙하지 않은 용어들이 이어지면서 무엇부터 이해해야할지 막막해지기 쉽다. 하지만 이 많은 알고리즘들은 사실 몇 가지 공통된 개념 위에서 움직인다. 그 핵심이 바로 &lt;b&gt;지도학습(Supervised Learning)&lt;/b&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: 'Nanum Gothic';&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 과정에서 중요한 것은 모델이 단순히 데이터를 외우는 것이 아니라, &lt;b&gt;보지 못한 새로운 데이터에도 적용 가능한 규칙을 학습해야 한다는 점&lt;/b&gt;이다. 이 능력을 흔히 &lt;b&gt;일반화(generalization)&lt;/b&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: 'Nanum Gothic';&quot;&gt;지도학습 문제는 크게 두 가지로 나뉜다. 하나는 &lt;b&gt;분류(classification)&lt;/b&gt;이고, 다른 하나는 &lt;b&gt;회귀(regression)&lt;/b&gt;이다. 분류는 결과가 특정 범주로 나뉘는 경우이다. 예를 들어 &quot;이메일이 스팸인지 아닌지&quot;, &quot;고객이 이탈하는지 아닌지&quot; 같은 문제는 분류에 해당한다. 반면 회귀는 결과가 연속적인 숫자로 나타나는 경우이다. 집값, 매출, 온도처럼 수치 자체를 예측하는 문제는 회귀 문제로 본다. 이 구분은 단순한 용어 차이가 아니라, 어떤 모델을 선택하고 어떤 방식으로 평가할지를 결정하는 기준이 된다.&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: 'Nanum Gothic';&quot;&gt;머신러닝을 공부하다보면 또 하나 중요한 개념을 반드시 만나게 된다. 바로 &lt;b&gt;과대적합(overfitting)&lt;/b&gt;과 &lt;b&gt;과소적합(underfitting)&lt;/b&gt;이다. 과대적합은 모델이 훈련 데이터에 지나치게 맞춰져서, 새로운 데이터에서는 성능이 떨어지는 상태를 말한다. 쉽게 말하면 데이터를 &quot;외워버린&quot; 상태이다. 반대로 과소적합은 모델이 너무 단순해서 데이터의 패턴을 제대로 학습하지 못한 상태이다. 이 경우는 훈련 데이터에서도 성능이 좋지 않다.&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: 'Nanum Gothic';&quot;&gt;두 개념은 결국 모델의 복잡도와 연결된다. 모델이 너무 복잡하면 과대적합이 발생하고, 너무 단순하면 과소적합이 발생한다. 따라서 머신러닝에서는 항상 이 둘 사이에서 균형을 찾는 것이 중요하다. 이 균형은 보통 &lt;b&gt;모델의 복잡도&lt;/b&gt;와 관련이 있다. 모델이 복잡할수록 더 많은 패턴을 표현할 수 있지만, 동시에 과대적합의 위험도 커진다. 반대로 모델이 단순할수록 과소적합이 발생하기 쉽다. 여기에 데이터의 양도 영향을 준다. 데이터가 충분히 많다면 복잡한 모델도 안정적으로 학습할 수 있지만, 데이터가 적다면 단순한 모델이 오히려 더 나은 결과를 낼 수 있다. 즉, 모델 선택은 단순히 &quot;좋은 알고리즘&quot;을 고르는 것이 아니라, &lt;b&gt;데이터 상황에 맞는 복잡도를 선택하는 과정&lt;/b&gt;이다.&amp;nbsp;&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: 'Nanum Gothic';&quot;&gt;이제 대표적인 지도학습 알고리즘들을 살펴보자. 먼저 가장 직관적인 모델인 &lt;b&gt;k-최근접 이웃(K-NN)&lt;/b&gt;이다. 이 모델은 새로운 데이터가 들어왔을 때 기존 데이터 중에서 가장 가까운 K개의 이웃을 찾아 그들의 정보를 바탕으로 결과를 결정한다. 분류 문제에서는 다수결로, 회귀 문제에서는 평균값으로 결과를 정한다. 구조가 단순하고 이해하기 쉬운 장점이 있지만, 데이터가 많아질수록 계산량이 증가한다는 특징이 있다.&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: 'Nanum Gothic';&quot;&gt;다음으로는 &lt;b&gt;선형 모델(linear model)&lt;/b&gt;이다. 선형 모델은 입력 변수들의 선형 결합으로 결과를 예측하는 방식이다. 가장 대표적인 예가&lt;b&gt; 선형회귀(regression)&lt;/b&gt;이다. 선형회귀는 실제 값과 예측 값 사이의 차이를 최소화하는 직선을 찾는 방법으로, 흔히 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만 선형회귀는 데이터에 과하게 맞춰질 수 있다. 이를 방지하기 위해 등장한 개념이 &lt;b&gt;규제(regularization)&lt;/b&gt;이다. 규제를 적용한 대표적인 모델이 &lt;b&gt;리지 회귀(Ridge)&lt;/b&gt;와 &lt;b&gt;라소(Lasso)&lt;/b&gt;이다. 리지는 계수의 크기를 줄여 모델을 안정적으로 만들고, 라소는 일부 계수를 0으로 만들어 변수 선택 효과까지 가져온다. 즉, 단순히 예측 을 하는 것을 넘어 모델을 일반화되도록 만드는 방법이다.&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: 'Nanum Gothic';&quot;&gt;분류 문제에서 선형 모델을 사용할 때는 &lt;b&gt;로지스틱 회귀(logistic regression)&lt;/b&gt;가 대표적이다. 이름은 회귀이지만 실제로는 분류 모델이다. 이 모델은 데이터를 두 그룹으로 나누는 &lt;b&gt;결정경계(dicision boundary)&lt;/b&gt;를 만든다. 여기에 더해 &lt;b&gt;서포트 벡터 머신(SVM)&lt;/b&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: 'Nanum Gothic';&quot;&gt;여러 클래스를 다루는 문제에서는 다중 클래스 분류 기법이 사용된다. 이는 하나의 모델로 여러 클래스를 동시에 예측하거나, 여러 개의 이진 분류기를 조합하는 방식으로 구현된다. 초심자 단계에서는 &quot;두 개 이상의 범주도 분류할 수 있다&quot; 정도로 이해하면 충분하다고 한다.&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: 'Nanum Gothic';&quot;&gt;확률적인 접근을 사용하는 모델로는 &lt;b&gt;나이브 베이즈(Naive Bayes)&lt;/b&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: 'Nanum Gothic';&quot;&gt;또 다른 중요한 모델은 &lt;b&gt;결정 트리(Decision Tree)&lt;/b&gt;이다. 결정 트리는 데이터를 질문 형태로 나누어가며 분류하는 구조를 가진다. 예를 들어 &quot;나이가 30 이상인가?&quot;, &quot;소득이 일정 수준 이상인가?&quot; 같은 기준으로 데이터를 계속 분할해 나간다. 직관적으로 이해하기 쉽고 시각화가 가능하다는 장점이 있지만, 하나의 트리만 사용할 경우 과대적합이 발생하기 쉽다.&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: 'Nanum Gothic';&quot;&gt;이 문제를 해결하기 위해 여러 개의 트리를 결합한 방식이 등장했는데, 이를 &lt;b&gt;앙상블(ensemble)&lt;/b&gt;이라고 한다. 대표적으로 &lt;b&gt;랜덤 포레스트(Random Forest)&lt;/b&gt;는 여러 개의 결정 트리를 만들어 결과를 평균내거나 다수결로 결합하는 방식이다. 또 다른 방법인 &lt;b&gt;그래디언트 부스팅(Gradient Boosting)&lt;/b&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;중요한 것은 특정 알고리즘을 많이 아는 것이 아니라, &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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL</category>
      <category>machine learning</category>
      <category>과대적합</category>
      <category>머신러닝</category>
      <category>분류</category>
      <category>지도학습</category>
      <category>회귀</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/355</guid>
      <comments>https://dreamyhand.tistory.com/355#entry355comment</comments>
      <pubDate>Sun, 29 Mar 2026 13:52:25 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝의 기본 흐름 이해하기: 데이터부터 첫 모델까지</title>
      <link>https://dreamyhand.tistory.com/354</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;K-NN으로 시작하는 첫 머신러닝 실습 흐름&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;머신러닝은 결국 데이터를 다루는 작업이기 때문에 가장 먼저 해야 할 일은 데이터를 준비하는 것이다. 데이터는 CSV 파일 형태일 수도 있고, 데이터베이스에서 불러올 수도 있으며, 라이브러리에서 제공하는 샘플 데이터일 수도 있다. 입문 단계에서는 구조가 잘 정리된 데이터를 사용하는 것이 이해해 도움이 될 것이다.&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: 'Nanum Gothic';&quot;&gt;파이썬에서는 보통 &lt;code&gt;pandas&lt;/code&gt;를 사용해 데이터를 불러온다. 데이터가 메모리 위에 올라오면, 이제부터는 그 데이터를 어떻게 나눌 것인지가 중요한 문제가 된다. 머신러닝에서는 데이터를 단순히 한 번 사용하는 것이 아니라, &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;훈련 데이터는 모델이 패턴을 학습하는 데 사용하는 데이터이고, 테스트 데이터는 그렇게 학습된 모델이 새로운 데이터에 대해서도 잘 작동하는지 확인하기 위한 데이터이다. 이 구분이 중요한 이유는, 모델이 단순히 데이터를 &quot;외우는 것&quot;이 아니라 &lt;b&gt;일반화(generalization)&lt;/b&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;이 과정을 파이썬에서는 보통 &lt;code&gt;train_test_split&lt;/code&gt; 함수를 통해 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774757890587&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)&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: 'Nanum Gothic';&quot;&gt;여기서 &lt;code&gt;X&lt;/code&gt;는 입력 데이터(특성), &lt;code&gt;y&lt;/code&gt;는 우리가 예측하려는 값(타깃)이다. 이렇게 나누어두면 모델은 &lt;code&gt;X_train&lt;/code&gt;과 &lt;code&gt;y_train&lt;/code&gt;을 이용해 학습하고, &lt;code&gt;X_test&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: 'Nanum Gothic';&quot;&gt;scikit-learn에서 데이터는 대문자 $X$로 표시하고 레이블은 소문자 $y$로 표기한다. 이는 수학에서 함수의 입력을 $x$, 출력을 $y$로 나타내는 표준 공식 $f(x)=y$에서 유래된 것이다. 수학의 표기 방식을 따르되 데이터는 2차원 배열(행렬)이므로 대문자 $X$를, 타깃은 1차원 배열(벡터)이므로 소문자 $y$를 사용한다.&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: 'Nanum Gothic';&quot;&gt;데이터를 나누었다고 해서 바로 모델을 만드는 것이 좋은 접근은 아니다. 그 전에 반드시 해야 할 일이 하나 있다. 바로 &lt;b&gt;데이터를 먼저 살펴보는 것&lt;/b&gt;이다. 이 과정은 흔히 EDA(탐색적 데이터 분석, Exploratory Data Analysis)라고 부른다.&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;아래 EDA Report 포스팅을 참고해보자. &lt;a href=&quot;https://dreamyhand.tistory.com/351&quot;&gt;https://dreamyhand.tistory.com/351&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1774758222398&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[EDA Report] IBM HR 데이터 기반 직원 이직 요인 탐색적 분석 (feat. 타자료 회귀분석)&quot; data-og-description=&quot;첫 번째 팀 단위 프로젝트를 마무리한 뒤, 마지막 과제로 EDA Report 작성이 주어졌다. 어차피 학습 과정의 일부이기도 해서, 우리 팀은 전체 프로세스를 직접 연습해보기로 했다.각자 관심있는 주&quot; data-og-host=&quot;dreamyhand.tistory.com&quot; data-og-source-url=&quot;https://dreamyhand.tistory.com/351&quot; data-og-url=&quot;https://dreamyhand.tistory.com/351&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/69kZ0/dJMb9b3RZGt/GBF39LDhHTQZZrTu1j9o51/img.png?width=800&amp;amp;height=5951&amp;amp;face=0_0_800_5951,https://scrap.kakaocdn.net/dn/xYJrX/dJMb9iIG1Gs/g4k0MP2U4VeSlKQsIyYB6k/img.png?width=800&amp;amp;height=5951&amp;amp;face=0_0_800_5951&quot;&gt;&lt;a href=&quot;https://dreamyhand.tistory.com/351&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dreamyhand.tistory.com/351&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/69kZ0/dJMb9b3RZGt/GBF39LDhHTQZZrTu1j9o51/img.png?width=800&amp;amp;height=5951&amp;amp;face=0_0_800_5951,https://scrap.kakaocdn.net/dn/xYJrX/dJMb9iIG1Gs/g4k0MP2U4VeSlKQsIyYB6k/img.png?width=800&amp;amp;height=5951&amp;amp;face=0_0_800_5951');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[EDA Report] IBM HR 데이터 기반 직원 이직 요인 탐색적 분석 (feat. 타자료 회귀분석)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 팀 단위 프로젝트를 마무리한 뒤, 마지막 과제로 EDA Report 작성이 주어졌다. 어차피 학습 과정의 일부이기도 해서, 우리 팀은 전체 프로세스를 직접 연습해보기로 했다.각자 관심있는 주&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dreamyhand.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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: 'Nanum Gothic';&quot;&gt;간단한 예로 &lt;code&gt;pandas&lt;/code&gt;의 &lt;code&gt;head()&lt;/code&gt;를 사용하면 데이터의 앞부분을 확인할 수 있고, &lt;code&gt;describe()&lt;/code&gt;를 사용하면 기본적인 통계 정보를 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774758266896&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.head()
df.describe()&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: 'Nanum Gothic';&quot;&gt;또한 &lt;code&gt;matplotlib&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: 'Nanum Gothic';&quot;&gt;이제 데이터에 대한 기본적인 이해가 끝났다면, 드디어 첫 번째 머신러닝 모델을 만들어볼 차례이다. 입문 단계에서 가장 많이 사용하는 알고리즘 중 하나가 k-최근접 이웃(K-Nearest Neighbors, K-NN) 이다.&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: 'Nanum Gothic';&quot;&gt;K-NN은 매우 직관적인 알고리즘이다. 새로운 데이터가 들어왔을 때, 기존 데이터 중에서 가장 가까운 K개의 이웃을 찾아 그 이웃들의 정보를 바탕으로 결과를 결정한다. 예를 들어 분류 문제라면, 주변에 있는 데이터들이 어떤 클래스에 속해 있는지를 보고 다수결로 결정한다.&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: 'Nanum Gothic';&quot;&gt;이 알고리즘의 핵심은 &quot;유사한 데이터는 비슷한 결과를 가진다&quot;는 가정이다. 즉, 데이터 간의 거리를 기준으로 판단을 내리는 방식이다. 그래서 K-NN에서는 거리 계산 방식과 K 값이 중요한 역할을 한다.&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: 'Nanum Gothic';&quot;&gt;scikit-learn에서는 K-NN 모델을 다음과 같이 만들 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774758477878&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)&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: 'Nanum Gothic';&quot;&gt;여기서 &lt;code&gt;n_neighbors=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: 'Nanum Gothic';&quot;&gt;모델을 학습시킨 다음에는 실제로 예측을 수행해볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774758524571&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pred = model.predict(X_test)&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;모델 평가에서는 단순히 &quot;잘 맞았다&quot;는 느낌이 아니라, &lt;b&gt;정량적인 기준&lt;/b&gt;이 필요하다. 분류 문제에서는 보통 정확도(accuracy)를 가장 기본적인 지표로 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774758614167&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.score(X_test, y_test)&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: 'Nanum Gothic';&quot;&gt;이 값은 모델이 테스트 데이터에서 얼마나 정확하게 예측했는지를 나타낸다. 예를 들어 0.9라는 값이 나왔다면, 전체 테스트 데이터 중 90%를 맞췄다는 의미이다.&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;여기까지가 머신러닝의 가장 기본적인 흐름이다. 데이터를 준비하고, 훈련 데이터와 테스트 데이터로 나누고, 데이터를 먼저 살펴본 뒤, 모델을 만들고, 예측을 수행하고, 결과를 평가하는 과정이다. 이 흐름을 한 번이라도 제대로 경험해보면 이후에는 배우는 알고리즘들은 단순히 &quot;모델의 종류&quot;로 이해되기 시작할 것이다.&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: 'Nanum Gothic';&quot;&gt;즉, 중요한 것은 특정 알고리즘 하나를 깊게 아는 것이 아니라, &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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ML &amp;amp; DL</category>
      <category>machine learning</category>
      <category>머신러닝</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/354</guid>
      <comments>https://dreamyhand.tistory.com/354#entry354comment</comments>
      <pubDate>Sun, 29 Mar 2026 13:33:16 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝을 시작할 때 먼저 알아야 할 것들</title>
      <link>https://dreamyhand.tistory.com/353</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;파이썬, scikit-learn, 그리고 필수 도구까지&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;머신러닝을 처음 공부할 때 많은 사람이 곧바로 알고리즘부터 배우고 싶어 한다. k-최근접 이웃, 선형회귀, 결정트리 같은 이름을 접하면 뭔가 본격적인 공부가 시작되는 것 같기 때문이다. 하지만 실제로 머신러닝의 출발점은 알고리즘의 이름을 외우는 데 있지 않다. 먼저 해야할 일은 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;머신러닝은 결국 데이터를 바탕으로 어떤 규칙이나 패턴을 학습하고, 그 학습 결과를 이용해 예측이나 판단을 수행하는 방법이다. 그런데 여기서 중요한 점은 머신러닝이 마법처럼 정답을 만들어내는 기술이 아니라는 점이다. 입력되는 데이터가 무엇인지, 우리가 예측하고 싶은 대상이 무엇인지, 그 데이터가 현실의 문제를 얼마나 잘 반영하는지에 따라 결과는 크게 달라진다. 그래서 머신러닝 공부의 첫 단계에서는 모델보다 먼저 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;예를 들어 고객 이탈 여부를 예측하고 싶다고 해보자. 이 경우 우리가 풀고 싶은 문제는 &quot;어떤 고객이 서비스를 떠날 가능성이 높은가&quot;라는 질문이 된다. 그렇다면 데이터에는 고객의 연령, 가입 기간, 구매 빈도, 문의 이력, 사용 패턴 같은 정보가 들어갈 수 있다. 이 정보들은 머신러닝에서 흔히 &lt;b&gt;특성(feature)&lt;/b&gt; 이라고 부른다. 그리고 최종적으로 예측하고 싶은 값, 즉 이탈 여부 자체는 &lt;b&gt;타깃(target)&lt;/b&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;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;이 과정에서 가장 자주 생기는 오해 중 하나는 &quot;좋은 알고리즘만 쓰면 성능이 나온다&quot;는 생각이다. 실제로는 그 반대에 가깝다. 대체로 성능을 좌우하는 가장 큰 요인은 알고리즘보다 데이터이다. 데이터가 부족하거나, 중요한 정보가 빠져 있거나, 값이 잘못 기록되어 있으면 아무리 유명한 모델을 써도 좋은 결과를 기대하기 어렵다. 머신러닝 분야에서 자주 언급되는 &quot;Garbage In, Garbage Out&quot;이라는 표현도 바로 이 점을 가리킨다. 잘못된 데이터가 들어가면 잘못된 결과가 나온다는 뜻이다. 그래서 머신러닝은 모델링의 기술이면서 동시에 &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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제를 이해할 때는 그것이 어떤 유형에 속하는지도 함께 생각해야 한다. 누군가가 스팸 메일인지 아닌지를 구분하고 싶다면 보통 &quot;스팸이다 / 아니다&quot;처럼 범주로 나뉜다. 이런 분제는&lt;b&gt; 분류(classification)&lt;/b&gt; 문제라고 한다. 반대로 집값이나 매출처럼 연속적인 숫자를 예측하고 싶다면 이는 &lt;b&gt;회귀(regression)&lt;/b&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: 'Nanum Gothic';&quot;&gt;이제 자연스럽게 다음 질문으로 넘어가게 된다. 그렇다면 이러한 머신러닝 작업은 어떤 언어와 도구로 수행하는 것이 좋을까. 현재 가장 널리 사용되는 선택지는 단연&lt;b&gt; 파이썬(Python)&lt;/b&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: 'Nanum Gothic';&quot;&gt;파이썬이 좋은 이유를 조금 더 현실적으로 말하면, &quot;혼자 공부하기에도 좋고, 실무로 이어지기에도 좋은 언어&quot;이기 때문이다. 데이터 분석과 머신러닝 분야에서 파이썬은 사실상 공용어처럼 쓰인다. 따라서 지금 파이썬으로 공부하는 것은 단지 한 가지 언어를 배우는 것이 아니라, 이후에 더 많은 도구와 예제를 이해할 수 있는 기반을 마련하는 일이기도 하다.&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: 'Nanum Gothic';&quot;&gt;파이썬 환경에서 머신러닝을 처음 배울 때 가장 많이 접하게되는 라이브러리가 &lt;b&gt;scikit-learn&lt;/b&gt; 이다. 이 라이브러리는 초심자에게 특히 좋은 출발점이 된다. 이유는 복잡한 알고리즘을 비교적 일관된 방식으로 사용할 수 있게 해주기 때문이다. 머신러닝 모델을 다룰 때 보통 &lt;code&gt;fit&lt;/code&gt;, &lt;code&gt;predict&lt;/code&gt;, &lt;code&gt;score&lt;/code&gt; 같은 공통된 메서드를 사용하게 되는데, scikit-learn은 이 구조를 매우 잘 통일해 두었다. 덕분에 한 알고리즘을 배운 뒤 다른 알고리즘으로 넘어갈 때도 사용 방식이 완전히 낯설게 느껴지지 않는다.&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: 'Nanum Gothic';&quot;&gt;예를 들어 어떤 모델을 학습시킨다고 할 때 &lt;code&gt;fit&lt;/code&gt;은 데이터를 바탕으로 모델이 규칙을 학습하는 단계이고, &lt;code&gt;predict&lt;/code&gt;는 그렇게 학습한 모델로 새로운 데이터에 대한 예측값을 만드는 단계이다. 초심자에게는 이 두 단계만 명확히 이해하도 전체 흐름이 훨씬 정리된다. 즉, 데이터를 준비한 뒤 모델을 학습시키고, 그다음 새로운 입력에 대해 결과를 예측하는 것이 머신러닝 실습의 기본 골격인 것이다. scikit-learn은 이 과정을 비교적 깔끔하게 보여주기 때문에 입문용으로 매우 적합하다.&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: 'Nanum Gothic';&quot;&gt;다만 머신러닝 공부가 scikit-learn 하나만으로 이루어지는 것은 아니다. 오히려 실제로는 그 주변의 도구들을 함께 익혀야 전체 그림이 보인다. 머신러닝 모델을 사용하기 전에 데이터를 불러와야 하고, 데이터를 정리해야 하며, 숫자 계산을 수행해야 하고, 결과를 시각화해 확인해야 하기 때문이다. 그래서 머신러닝 입문에서는 몇 가지 필수 라이브러리와 작업 환경을 함께 익히는 것이 중요하다.&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: 'Nanum Gothic';&quot;&gt;가장 먼저 익히게 되는 작업 환경 중 하나가 &lt;b&gt;주피터 노트북(Jupyter Notebook)&lt;/b&gt; 이다. 주피터 노트북은 코드와 실행 결과, 설명 문장을 한 화면에서 함께 다룰 수 있는 환경이다. 일반적인 파이썬 파일 코드를 작성하고 실행하는 흐름에 집중되어 있지만, 주피터 노트북은 &quot;설명하면서 실험하는 방식&quot;에 훨씬 잘 맞는다. 셀 단위로 코드를 나누어 실행 할 수 있기 때문에 데이터를 조금씩 확인하면서 진행하기 좋고, 중간 결과를 바로바로 눈으로 확인할 수 있다. 그래서 데이터 분석이나 머신러닝 입문에서는 거의 표준처럼 사용된다.&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: 'Nanum Gothic';&quot;&gt;특히 초심자에게 주피터 노트북이 좋은 이유는, 공부 과정 자체를 기록처럼 남길 수 있기 때문이다. 단순히 코드를 실행하는 데 그치지 않고, &quot;왜 이런 전처리를 했는지&quot;, &quot;이 그래프에서 무엇을 확인했는지&quot;, &quot;모델 결과를 어떻게 해석해야 하는지&quot;를 함께 적어둘 수 있다. 즉, 노트북은 실행 도구인 동시에 학습 노트의 역할도 한다. 머신러닝을 처음 배울 때는 결과보다 과정이 더 중요할 때가 많은데, 주피너 노트북은 그 과정을 자연스럽게 정리하게 해준다.&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: 'Nanum Gothic';&quot;&gt;수치 계산의 핵심에는 &lt;b&gt;NumPy&lt;/b&gt;가 있다. NumPy는 파이썬에서 배열(array)을 효율적으로 다루기 위한 라이브러리이다. 파이썬의 기본 리스트로도 숫자를 저장할 수는 있지만, 대규모 수치 계산이나 행렬 연산을 빠르게 수행하기에는 한계가 있다. NumPy는 이런 작업을 훨씬 효율적으로 처리할 수 있도록 설계되어 있다. 머신러닝에서 다루는 데이터는 결국 숫자의 집합인 경우가 많기 때문에, NumPy는 눈에 보이지 않는 곳에서 거의 모든 계산의 기반이된다.&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: 'Nanum Gothic';&quot;&gt;NumPy를 이해할 때 중요한 개념은 &quot;배열 기반 연산&quot;이다. 예를 들어 같은 길이의 숫자 묶음 두 개에 대해 각각 더하거나 곱하는 연산을 매우 빠르게 수행할 수 있다. 또한 여러 값에 대해 반복문을 하나하나 돌리지 않아도 한 번에 계산하는&lt;b&gt; 벡터화(vectorization)&lt;/b&gt;가 가능하다. 초심자 입장에서는 처음부터 벡터화라는 용어를 완벽히 이해할 필요는 없지만, &quot;NumPy는 많은 숫자를 한꺼번에 빠르게 처리하기 위해 존재한다&quot; 정도로 이해해두면 충분할 것이다.&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: 'Nanum Gothic';&quot;&gt;NumPy와 자주 함께 언급되는 라이브러리가 &lt;b&gt;SciPy&lt;/b&gt;이다. SciPy는 NumPy를 바탕으로 더 고급의 과학 계산 기능을 제공한다. 선형대수, 최적화, 확률 분포, 신호 처리 등 다양한 기능이 포함되어 있다. 머신러닝을 아주 처음 배울 때는 SciPy를 직접 많이 쓰지 않을 수도 있다. 하지만 배경에서 여러 계산을 지원하고 있으며, 파이썬 과학 계산 생태계의 중요한 축이라는 점은 알아둘 필요가 있다. 쉽게 말해 NumPy가 기본적인 수치 계산의 토대라면, SciPy는 그 위에서 보다 전문적인 계산 도구들을 제공하는 확장판에 가깝다.&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: 'Nanum Gothic';&quot;&gt;머신러닝에서 숫자만 보는 것은 부족할 때가 많다. 데이터를 이해하려면 &lt;b&gt;시각화&lt;/b&gt;가 필요하다. 그때 가장 기본이 되는 도구가&lt;b&gt; matplotlib&lt;/b&gt;이다. matplotlib은 그래프를 그리는 라이브러리로, 선 그래프, 막대 그래프, 산점도, 히스토그램 같은 기본적인 시각화를 만들 수 있다. 데이터 분석 초반에는 모델을 학습시키기 전에 데이터의 분포를 먼저 확인하는 일이 중요하다. 값이 한 쪽에 치우쳐 있는지, 이상치(outlier)가 있는지, 두 변수 사이에 대략적인 관계가 보이는지 등을 그림으로 확인하면 숫자만 볼 때보다 훨씬 직관적으로 이해할 수 있다.&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: 'Nanum Gothic';&quot;&gt;예를 들어 특정 변수의 분포를 보고 싶다면 히스토그램을 그릴 수 있고, 두 수치형 변수의 관계를 보고 싶다면 산점도를 사용할 수 있다. 처음에는 &quot;그래프를 예쁘게 그리는 것&quot;보다 &quot;데이터를 이해하기 위해 그래프를 그리는 것&quot;이 더 중요하다. matplotlib은 바로 이런 기본기에 충실한 도구이다. 복잡한 시각화 라이브러리로 넘어가기 전에, 가장 먼저 데이터의 형태를 눈으로 확인하는 습관을 들이는 데 적합하다.&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: 'Nanum Gothic';&quot;&gt;그리고 데이터 분석과 머신러닝 실습에서 가장 자주 사용하는 라이브러리가 바로 &lt;b&gt;pandas&lt;/b&gt;이다. pandas는 표 형태의 데이터를 다루기 위한 도구이며, 실제로는 엑셀보다 훨씬 강력한 데이터 작업 도구라고 생가개도 무방하다. CSV 파일을 불러오고, 필요한 열만 선택하고, 결측치를 처리하고, 조건에 맞는 행을 필터링하고, 그룹별 통계를 내는 작업 등이 모두 pandas를 중심으로 이루어진다. 머신러닝 모델을 학습시키기 전에 데이터를 정리하는 시간은 생각보다 길다. 그래서 현업에서도 &quot;머신러닝보다 pandas를 더 많이 쓴다&quot;는 말이 나온다고 한다.&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: 'Nanum Gothic';&quot;&gt;pandas의 핵심 객체는 &lt;b&gt;DataFrame&lt;/b&gt;이다. DataFrame은 행과 열로 이루어진 2차원 표 구조이며, 엑셀 시트와 비슷한 느낌으로 이해할 수 있다. 다만 단순히 표를 보는 데 그치지 않고, 프로그래밍 방식으로 데이터를 체계적으로 조작할 수 있다는 점이 다르다. 예를 들어 어떤 열의 값만 골라서 평균을 내거나, 특정 조건을 만족하는 데이터만 추출하거나, 날짜 형식을 변환하는 작업을 손쉽게 수행할 수 있다. 초심자에게 pandas는 처음엔 가장 헷갈릴 수 있는 도구이기도 하지만, 동시에 한 번 익혀두면 데이터 다루는 감각이 확실히 달라지는 핵심 도구이다.&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: 'Nanum Gothic';&quot;&gt;여기까지 정리하면, 머신러닝을 시작하는 단계에서 가장 먼저 익혀야 할 것은 의외로 알고리즘 자체가 아니라는 점이 보인다. 먼저 문제를 정의하고, 그 문제를 데이터로 표현할 수 있어야 한다. 그리고 그 데이터를 다루기 위해 파이썬 환경을 이해하고, scikit-learn을 중심으로 NumPy, SciPy, matplotlib, pandas, 주피터 노트북 같은 도구들을 함께 익혀야 한다. 이 도구들은 각각 따로 떨어진 것이 아니라, 실제 작업 흐름 안에서 서로 연결되어 있다. pandas로 데이터를 읽고 정리한 뒤, matplotlib으로 분포를 화긴하고, NumPy 기반의 배열 형태로 계산을 수행하며, scikit-learn으로 모델을 학습하는 식이다. 머신러닝은 결국 이 전체 흐름을 이해하는 공부라고 할 수 있겠다.&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: 'Nanum Gothic';&quot;&gt;비전공자로서 머신러닝, 딥러닝을 공부할 때, 무엇을 먼저 이해하고 어디에 초점을 두어야하는지 차근차근 정리해보았다.&amp;nbsp;&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;</description>
      <category>ML &amp;amp; DL</category>
      <category>machine learning</category>
      <category>머신러닝</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/353</guid>
      <comments>https://dreamyhand.tistory.com/353#entry353comment</comments>
      <pubDate>Sun, 29 Mar 2026 12:52:30 +0900</pubDate>
    </item>
    <item>
      <title>[EDA Report] IBM HR 데이터 기반 직원 이직 요인 탐색적 분석 (feat. 타자료 회귀분석)</title>
      <link>https://dreamyhand.tistory.com/351</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;첫 번째 팀 단위 프로젝트를 마무리한 뒤, 마지막 과제로 EDA Report 작성이 주어졌다.&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: Nanum Gothic;&quot;&gt;어차피 학습 과정의 일부이기도 해서, 우리 팀은 전체 프로세스를 직접 연습해보기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;각자 관심있는 주제를 하나씩 골라 EDA Report를 작성하고, 점심시간에 결과를 서로 공유한 뒤 발표자료로 제출할 주제를 선택하기로 했다.&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: Nanum Gothic;&quot;&gt;나 역시 Kaggle에서 EDA Report 작성과 시각화에 활용할 수 있는 CSV 데이터를 찾다가, 회사 입장에서 직원 이탈은 분명한 pain point가 될 수 있겠다고 생각해 아래 자료를 선택했다.&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: Nanum Gothic;&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/datasets/pavansubhasht/ibm-hr-analytics-attrition-dataset?utm_source=chatgpt.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.kaggle.com/datasets/pavansubhasht/ibm-hr-analytics-attrition-dataset&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1774566276878&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;IBM HR Analytics Employee Attrition &amp;amp; Performance&quot; data-og-description=&quot;Predict attrition of your valuable employees&quot; data-og-host=&quot;www.kaggle.com&quot; data-og-source-url=&quot;https://www.kaggle.com/datasets/pavansubhasht/ibm-hr-analytics-attrition-dataset?utm_source=chatgpt.com&quot; data-og-url=&quot;https://www.kaggle.com/datasets/pavansubhasht/ibm-hr-analytics-attrition-dataset&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZCjdT/dJMb88e0obl/33sj2ayHkPdun4HIKcEick/img.jpg?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/bd4NJA/dJMb81GWZxq/icp5lc5VunZuLC5UoUAhB1/img.jpg?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://www.kaggle.com/datasets/pavansubhasht/ibm-hr-analytics-attrition-dataset?utm_source=chatgpt.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kaggle.com/datasets/pavansubhasht/ibm-hr-analytics-attrition-dataset?utm_source=chatgpt.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZCjdT/dJMb88e0obl/33sj2ayHkPdun4HIKcEick/img.jpg?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/bd4NJA/dJMb81GWZxq/icp5lc5VunZuLC5UoUAhB1/img.jpg?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;IBM HR Analytics Employee Attrition &amp;amp; Performance&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Predict attrition of your valuable employees&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kaggle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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: Nanum Gothic;&quot;&gt;작성은 vscode에서 markdown으로 했고, 결과는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;[EDA&amp;nbsp;Report]&amp;nbsp;IBM&amp;nbsp;HR&amp;nbsp;데이터&amp;nbsp;기반&amp;nbsp;직원&amp;nbsp;이직&amp;nbsp;요인&amp;nbsp;탐색적&amp;nbsp;분석&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;FireShot Capture 150 - j-ai-616_eda_report_ EDA REPORT 작성 연습 - [github.com].png&quot; data-origin-width=&quot;1766&quot; data-origin-height=&quot;13139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctDb4K/dJMb99TlOgC/GjCt8IVpYpIAIL8GM0Yxf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctDb4K/dJMb99TlOgC/GjCt8IVpYpIAIL8GM0Yxf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctDb4K/dJMb99TlOgC/GjCt8IVpYpIAIL8GM0Yxf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctDb4K%2FdJMb99TlOgC%2FGjCt8IVpYpIAIL8GM0Yxf0%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;857&quot; height=&quot;6376&quot; data-filename=&quot;FireShot Capture 150 - j-ai-616_eda_report_ EDA REPORT 작성 연습 - [github.com].png&quot; data-origin-width=&quot;1766&quot; data-origin-height=&quot;13139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;EDA 결과를 넘어: 다른 데이터와의 연결&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;이번 IBM HR 데이터 EDA에서는 '초과근무(OverTime)'가 직원 이직(Attrition)에 가장 강하게 연관된 변수로 나타났다.&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: Nanum Gothic;&quot;&gt;흥미로운 점은 이 결과가 단순히 하나의 기업 데이터에 국한되지 않는다는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;이번주에 분석했던 근로환경조사(1~7차 반복횡단면) 데이터의 Stata 회귀분석 결과에서도 '하루 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: Nanum Gothic;&quot;&gt;즉, 서로 다른 데이터셋과 분석 방법(EDA vs. 회귀분석)에도 불구하고 &quot;장시간 근로 &amp;rarr; 개인의 부담 증가&quot;라는 일관된 패턴이 확인된 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1280x0-3.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Sz7s/dJMcajayHY4/qbWEwrUcVpieGlcSO8RMAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Sz7s/dJMcajayHY4/qbWEwrUcVpieGlcSO8RMAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Sz7s/dJMcajayHY4/qbWEwrUcVpieGlcSO8RMAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Sz7s%2FdJMcajayHY4%2FqbWEwrUcVpieGlcSO8RMAk%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;706&quot; height=&quot;1017&quot; data-filename=&quot;R1280x0-3.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;이 두 결과를 함께 보면, 초과근무는 단순한 근무시간 문제가 아니라 다음과 같은 연쇄적 영향 구조를 가진 변수로 해석할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;초과근무&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;&amp;rarr; 피로 누적 및 건강 리스크 증가&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;&amp;rarr; 직무 만족도 저하&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;&amp;rarr; 이직 의도 및 실제 이직 증가&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;즉, EDA에서 확인된 &quot;이직률 증가&quot;는 이미 건강 및 피로 수준에서 선행 신호가 존재하는 구조적 결과일 가능성이 높다.&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: Nanum Gothic;&quot;&gt;이러한 결과는 기업 입장에서 다음과 같은 중요한 인사이트를 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;- 초과근무는 단순 생산성 문제가 아니라 리스크 변수다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;- 이직을 줄이기 위해서는 보상보다 근무시간 관리가 선행되어야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&gt;- 데이터 분석 시에도 단일 KPI(이직률)가 아니라 건강, 피로, 근무시간을 함께 보는 통합적 접근이 필요하다.&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: Nanum Gothic;&quot;&gt;이번 분석을 통해 느낀점은&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Nanum Gothic;&quot;&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: Nanum Gothic;&quot;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Projects/Project Portfolio</category>
      <category>attrition</category>
      <category>EDA</category>
      <category>Markdown</category>
      <category>matplotlib</category>
      <category>PANDAS</category>
      <category>Report</category>
      <category>시각화</category>
      <category>이직</category>
      <category>회귀분석</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/351</guid>
      <comments>https://dreamyhand.tistory.com/351#entry351comment</comments>
      <pubDate>Sat, 28 Mar 2026 14:52:48 +0900</pubDate>
    </item>
    <item>
      <title>[Stata] 초보자를 위한 데이터 전처리부터 회귀분석까지 정리</title>
      <link>https://dreamyhand.tistory.com/350</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Stata를 처음 배울 때, 명령어 하나하나는 이해가 되더라도 막상 do-file 전체를 보면 &quot;이 코드가 지금 무슨 흐름으로 돌아가는 거지?&quot; 싶을 때가 있었습니다.&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: 'Nanum Gothic';&quot;&gt;use, rename, recode, gen, replace 정도는 알아도 전처리 파일을 만들고, 여러 데이터를 합치고, 분석용 변수를 새로 만들고, 회귀분석까지 이어지는 전체 흐름은 한 번에 잘 안들어왔었습니다.&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: 'Nanum Gothic';&quot;&gt;이번 글에서는 특정 데이터셋 자체를 설명하기보다, Stata do-file에서 자주 등장하는 핵심 코드들을 초보자 눈높이에서 전반적으로 정리해보려고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. do-file의 시작: 작업 환경 정리&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Stata do-file은 보통 아래처럼 시작하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774513571305&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;clear all
set more off
cd &quot;C:\project\data&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;clear all&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 메모리에 올라가 있는 데이터, 설정, 결과 등을 지웁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;&lt;b&gt;set more off&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Stata는 결과가 길면 중간에 멈추면서 more를 띄우는데, 이 옵션을 끄면 코드가 자동으로 끝까지 실행됩니다.&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: 'Nanum Gothic';&quot;&gt;&lt;b&gt;cd&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;change directory, 현재 작업 폴더를 지정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이후 use &quot;file.dta&quot; 또는 save &quot;result.dta&quot;, replace 같은 코드를 쓸 때 기준이 되는 경로라고 생각하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 데이터 불러오기와 저장&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;가장 기본적인 입출력 명령입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774513728551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use &quot;sample.dta&quot;, clear
save &quot;sample_clean.dta&quot;, replace&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: 'Nanum Gothic';&quot;&gt;&lt;b&gt;use&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Stata 데이터 파일(.dta)을 불러옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;, clear: 기존 데이터가 있어도 지우고 불러오기&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: 'Nanum Gothic';&quot;&gt;&lt;b&gt;save&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 메모리에 있는 데이터를 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;, replace: 같은 이름의 파일이 있으면 덮어쓰기&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;예:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 원본: raw_data.dta&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 전처리 후: clean_data.dta&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 분석용 최종본: analysis_data.dta&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: 'Nanum Gothic';&quot;&gt;이렇게 단계별 파일을 나누면 훨씬 관리하기 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 변수명 바꾸기: rename&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여러 해(차시)의 데이터나 여러 버전의 데이터를 다루다 보면 같은 의미인데 변수명이 다를 때가 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(Stata는 대소문자를 구분합니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774513932770&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rename TSEX sex
rename AGE age
rename wt weight&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: 'Nanum Gothic';&quot;&gt;이럴 때 rename으로 변수명을 통일해두면 나중에 여러 파일을 합칠 때 훨씬 편합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 새 변수 만들기: gen&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분석에 필요한 파생변수는 gen으로 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774513975783&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gen survey_year = 2023
gen wave = 7&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;또는 조건에 따라 비어있는 변수를 먼저 만든 뒤 값을 채우기도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514020131&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gen health_risk = .&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: 'Nanum Gothic';&quot;&gt;여기서 . 은 Stata의 결측값입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;즉, 일단 빈 변수부터 만들어 둔 뒤 나중에 replace로 채우는 패턴입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. 조건에 따라 값 바꾸기: replace&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;replace는 기존 변수의 값을 바꾸는 명령어입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514074400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;replace health_risk = 1 if risk_raw == 1
replace health_risk = 0 if risk_raw == 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특히 설문문항을 분석용 더미변수(0/1 변수)로 바꿀 때 많이 씁니다.&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: 'Nanum Gothic';&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: 'Nanum Gothic';&quot;&gt;1 = 예&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2 = 아니오&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;8 = 무응답&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;9 = 모름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&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: 'Nanum Gothic';&quot;&gt;예 &amp;rarr; 1&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아니오 &amp;rarr; 0&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;무응답/모름 &amp;rarr; 결측&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;6. 숫자형/문자형 맞추기: tostring&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;예를 들어 어떤 파일에서는 id가 숫자형이고, 다른 파일에서는 문자형이면 append 할 때 문제가 날 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514203674&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tostring id, replace format(%20.0f)&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: 'Nanum Gothic';&quot;&gt;특히 주민번호 일부, 사업장 코드, 응답자 ID처럼 &quot;숫자처럼 보이지만 사실은 식별자&quot;인 경우, 문자열로 통일해두는 것이 안전할 때가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;7. 특정 값을 결측으로 바꾸기: mvdecode&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설문자료에서는 결측이 . 로 저장되지 않고 8, 9, 88, 99, 999 같은 코드로 들어있는 경우가 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514279363&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mvdecode edu, mv(9)
mvdecode comp_size, mv(88 99)
mvdecode workhour, mv(888 999)&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: 'Nanum Gothic';&quot;&gt;이 값들은 실제 무응답값이 아니라 &quot;모름&quot;, &quot;무응답&quot;, &quot;해당 없음&quot; 같은 코드이므로 Stata의 결측값으로 바꿔주겠다는 뜻입니다.&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: 'Nanum Gothic';&quot;&gt;이 작업을 안 하면 나중에 평균, 회귀분석, 상관분석에서 이상한 값으로 계산될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;8. 필요한 변수만 남기기: keep&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;원자료에는 변수가 매우 많을 수 있습니다. 그중 실제로 분석에 쓸 변수만 남기고 싶다면 keep 을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514355979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keep id sex age edu workhour income health_risk weight&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;반대로 특정 변수만 제거하고 싶다면 drop 을 씁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;9. 여러 파일 이어 붙이기(세로): append&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;반복 조사자료나 연도별 자료를 하나로 합칠 때 자주 쓰는 명령어입니다. 개념적으로 생각해보면 세로로 이어 붙이는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;가로로 이어붙이는 것은 merge 를 사용하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774514429199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use &quot;wave1_clean.dta&quot;, clear
append using &quot;wave2_clean.dta&quot;
append using &quot;wave3_clean.dta&quot;
append using &quot;wave4_clean.dta&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단, 이때 가장 중요한 전제는 같은 의미의 변수명이 미리 통일되어 있어야 한다는 점입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래서 앞에서 rename 작업이 중요했던 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10. 결측이 있는 행 제거하기: drop if missing()&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분석에 필요한 핵심 변수들 중 하나라도 비어있으면 회귀분석 표본에서 제외해야 할 때가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514504555&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;drop if missing(sex, age, edu, workhour, health_risk, weight_std)&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: 'Nanum Gothic';&quot;&gt;괄호 안 변수들 중에 하나라도 결측이면 그 행을 삭제합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;다만 초보자라면, 행을 지우는 코드는 되돌리기 어렵기 때문에 가능하면 원본에 바로 하지말고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분석용 파일을 따로 저장해서 작업하는 방법이 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;12. 값에 이름 붙이기: label define, label values&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;숫자 코드만 보면 결과표 해석이 불편할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래서 범주형 변수에는 라벨을 붙이는 경우가 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514589262&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;label define wh_cat 1 &quot;&amp;lt;40&quot; 2 &quot;40-51&quot; 3 &quot;52-59&quot; 4 &quot;60+&quot;
label values wh_cat wh_cat&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: 'Nanum Gothic';&quot;&gt;이렇게 해두면 결과표나 tabulation(tab)에서 1, 2, 3, 4 대신 읽기 쉬운 범주명이 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;13. 회귀분석: reg&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Stata에서 가장 기본적인 회귀명령은 reg 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774514717481&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;reg y x1 x2 x3&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: 'Nanum Gothic';&quot;&gt;초보자 때는 Stata를 배울 때 명령어를 따로따로 외우기 쉽습니다. 그리고 창에 한줄씩 입력하기도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그런데 실제 do-file을 사용하면 한 번에 실행시킬 수 있고, 명령어들이 분석 흐름 속에서 연결되어 있다는 점이 좋습니다.&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: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;데이터 정리하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분석에 맞는 변수 만들기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;표본 확정하기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;중요한 것은 명령어를 많이 아는 것보다, 결과가 나오는 것이며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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: 'Nanum Gothic';&quot;&gt;Stata를 이제 막 시작한 분이라면 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Concept Notes/Statistics &amp;amp; Stata</category>
      <category>do-file</category>
      <category>Stata</category>
      <author>J. Son</author>
      <guid isPermaLink="true">https://dreamyhand.tistory.com/350</guid>
      <comments>https://dreamyhand.tistory.com/350#entry350comment</comments>
      <pubDate>Thu, 26 Mar 2026 17:48:30 +0900</pubDate>
    </item>
  </channel>
</rss>