18. 텍스트 데이터 분석

🎯 이 장의 목표
  • 텍스트(글자) 데이터를 불러와 살펴본다
  • 문자열을 다듬는다(대소문자·공백·기호 제거)
  • 토큰화·불용어 제거로 단어를 정리한다
  • 워드클라우드로 자주 나온 단어를 시각화한다
💡 팁
후기, 댓글, 기사처럼 글로 된 데이터도 분석 대상입니다. 숫자와 달리 글은 다듬는 과정이 더 필요한데, 그 기본기를 이 마지막 장에서 익힙니다.

먼저: 텍스트 데이터는 왜 따로 다루나요?

숫자는 바로 평균·합계를 낼 수 있지만, 글은 그렇지 않습니다. "좋아요!""좋아요", "좋아요 "(뒤 공백)는 사람 눈엔 같지만 컴퓨터엔 다른 글자입니다. 그래서 텍스트 분석은 정리(전처리)가 절반입니다. 대소문자를 통일하고, 불필요한 기호·공백을 없애고, 의미 없는 단어를 걸러내는 과정을 거칩니다.

🔑 새 용어 — 전처리(preprocessing)
분석 전에 데이터를 분석하기 좋은 상태로 다듬는 모든 작업입니다. 12장의 결측치 처리도 전처리의 일종이고, 텍스트에선 특히 비중이 큽니다.

문자열 다듬기 — Pandas의 .str

0부에서 본 문자열 메서드(upper, strip 등)를 Pandas에서는 .str을 붙여 열 전체에 한 번에 적용합니다.

PYTHON
import pandas as pd

reviews = pd.Series(["  맛있어요!!  ", "별로...", "다시 올게요^^", "맛있어요"])

print(reviews.str.strip())          # 양 끝 공백 제거
print("---")
print(reviews.str.len())            # 각 글자 길이
print("---")
print(reviews.str.contains("맛있"))  # '맛있' 포함 여부

실행 결과:

CODE
0    맛있어요!!
1      별로...
2    다시 올게요^^
3      맛있어요
dtype: object
---
0    8
1    4
2    7
3    4
dtype: int64
---
0     True
1    False
2    False
3     True
dtype: bool
🔑 새 용어 — .str 접근자
문자열 시리즈에 붙여 문자열 메서드를 열 전체에 적용하는 도구입니다. 17장의 .dt가 날짜용이었다면, .str은 글자용입니다. .str.upper(), .str.replace(), .str.split() 등 대부분의 문자열 기능을 쓸 수 있습니다.

기호·숫자 제거하기

분석에 방해되는 문장부호 등을 없앨 때는 .str.replace정규식을 쓸 수 있습니다.

PYTHON
import pandas as pd

reviews = pd.Series(["맛있어요!!", "별로...", "다시 올게요^^"])

# 한글·공백만 남기고 나머지(기호) 제거
cleaned = reviews.str.replace(r"[^가-힣\s]", "", regex=True)
print(cleaned)

실행 결과:

CODE
0     맛있어요
1       별로
2    다시 올게요
dtype: object
🔑 새 용어 — 정규식(정규 표현식, regex)
글자 패턴을 표현하는 작은 규칙 언어입니다. 위의 [^가-힣\s]는 "한글(가~힣)과 공백(\s)이 아닌 모든 것"을 뜻해서, 그것들을 빈 문자열로 바꿔(=지워) 줍니다. 정규식은 처음엔 어렵지만, "기호 제거" 같은 패턴은 외워 두면 유용합니다. 지금은 깊이 몰라도 괜찮습니다.

토큰화 — 문장을 단어로 쪼개기

🔑 새 용어 — 토큰화(tokenization)
문장을 단어(토큰) 단위로 쪼개는 것입니다. "나는 파이썬을 좋아해" → ["나는", "파이썬을", "좋아해"]. 단어별로 세거나 분석하려면 먼저 토큰화가 필요합니다. 여기서 "토큰(token)"은 쪼개진 한 조각(보통 한 단어)을 뜻합니다.

가장 간단한 토큰화는 공백 기준 분리입니다. .str.split()을 씁니다.

PYTHON
import pandas as pd

s = pd.Series(["나는 파이썬을 좋아해", "데이터 분석은 재미있어"])
print(s.str.split())

실행 결과:

CODE
0    [나는, 파이썬을, 좋아해]
1    [데이터, 분석은, 재미있어]
dtype: object
💡 팁
한국어는 조사(은/는/을/를) 때문에 단순 공백 분리만으로는 부족할 때가 많습니다. 정교한 한국어 토큰화에는 KoNLPy 같은 전문 도구를 쓰지만, 입문 단계에선 공백 분리로 감을 잡는 것으로 충분합니다.

단어 빈도 세기

토큰을 모두 펼쳐서 어떤 단어가 자주 나왔는지 셉니다. 14장의 value_counts를 활용합니다.

PYTHON
import pandas as pd

texts = pd.Series([
    "파이썬 좋아 파이썬 재미",
    "데이터 파이썬 분석",
    "분석 재미 데이터"
])

# 모든 텍스트를 합쳐 단어로 쪼갬
all_words = " ".join(texts).split()
word_counts = pd.Series(all_words).value_counts()
print(word_counts)

실행 결과:

CODE
파이썬    3
데이터    2
분석     2
재미     2
좋아     1
dtype: int64

읽는 법: " ".join(texts)로 모든 글을 하나로 잇고 → .split()으로 단어를 쪼갠 뒤 → value_counts()로 빈도를 셌습니다. "파이썬"이 3번으로 가장 많네요.

불용어 제거

🔑 새 용어 — 불용어(stopword)
"은/는/이/가/그리고/the/a/is"처럼 자주 나오지만 의미 분석엔 도움이 안 되는 단어입니다. 빈도를 세면 이런 단어가 상위를 차지해 분석을 흐리므로, 미리 제거합니다.
PYTHON
import pandas as pd

words = pd.Series(["나는", "파이썬", "이", "좋다", "그리고", "데이터", "는", "재미있다"])
stopwords = ["나는", "이", "그리고", "는", "은", "가", "를", "을"]

filtered = words[~words.isin(stopwords)]   # 불용어가 '아닌' 것만
print(filtered)

실행 결과:

CODE
1     파이썬
3      좋다
5     데이터
7    재미있다
dtype: object
🔑 새 용어 — isin~
  • isin(목록): 각 값이 목록에 들어 있는지 참/거짓으로 알려 줍니다.
  • ~(물결): 참/거짓을 뒤집습니다(NOT). 그래서 ~words.isin(stopwords)는 "불용어 목록에 없는 것"이 되어, 불용어를 걸러냅니다.

워드클라우드: 자주 나온 단어를 그림으로

🔑 새 용어 — 워드클라우드(word cloud)
자주 나온 단어일수록 크게 표시해, 텍스트의 핵심을 한눈에 보여 주는 그림입니다. 후기·기사 등에서 "무엇이 가장 많이 언급됐나"를 직관적으로 전달합니다.

Colab에는 워드클라우드 라이브러리가 보통 깔려 있습니다. 없다면 !pip install wordcloud로 설치합니다(!로 시작하면 설치 명령).

PYTHON
from wordcloud import WordCloud
import matplotlib.pyplot as plt

text = "파이썬 파이썬 파이썬 데이터 데이터 분석 분석 재미 시각화 파이썬"

wc = WordCloud(width=600, height=400, background_color="white").generate(text)

plt.figure(figsize=(8, 5))
plt.imshow(wc, interpolation="bilinear")   # 워드클라우드를 그림으로 표시
plt.axis("off")                            # 축 숨기기
plt.show()

나오는 그래프: 흰 바탕에 단어들이 흩어진 그림이 나옵니다. 가장 많이 나온 "파이썬"이 가장 크게, 그다음 "데이터"·"분석"이 중간 크기로 표시됩니다.

⚠️ 흔한 실수
한글 워드클라우드 주의: 워드클라우드도 Matplotlib처럼 기본 폰트로는 한글이 깨질 수 있습니다. 한글을 제대로 보려면 WordCloud(font_path="한글폰트경로.ttf", ...)로 한글 폰트를 지정해야 합니다(Colab에서 나눔폰트 등을 설치해 경로를 줌). 영어 텍스트는 폰트 지정 없이 바로 됩니다.

불용어를 빼고 그릴 수도 있습니다.

PYTHON
from wordcloud import WordCloud, STOPWORDS

text = "the data is good the analysis is fun data python"
stopwords = set(STOPWORDS)        # 영어 기본 불용어 모음
stopwords.update(["is", "the"])   # 더 추가 가능

wc = WordCloud(stopwords=stopwords, background_color="white").generate(text)
🔑 새 용어 — STOPWORDS
워드클라우드 라이브러리가 미리 갖춘 영어 불용어 모음입니다. stopwords= 옵션에 넘기면 "the/is/a" 같은 단어를 자동으로 빼고 그려 줍니다.

🛠 미니 챌린지

PYTHON
import pandas as pd
comments = pd.Series([
    "배송 빠르고 좋아요",
    "품질 좋아요 배송도 빠름",
    "그냥 그래요 배송 느림"
])
  1. 모든 댓글을 공백으로 토큰화해 단어 리스트를 만드세요.
  2. 단어별 빈도를 세어 출력하세요. 가장 많이 나온 단어는?
  3. (도전) 영어 텍스트 "good good service fast delivery good"로 워드클라우드를 그려 보세요.

✅ 미니 챌린지 해설

PYTHON
import pandas as pd
comments = pd.Series([
    "배송 빠르고 좋아요",
    "품질 좋아요 배송도 빠름",
    "그냥 그래요 배송 느림"
])

# 1. 토큰화 + 2. 빈도
all_words = " ".join(comments).split()
counts = pd.Series(all_words).value_counts()
print(counts)

실행 결과:

CODE
배송     3
좋아요    2
빠르고    1
품질     1
배송도    1
빠름     1
그냥     1
그래요    1
느림     1
dtype: int64

가장 많이 나온 단어는 "배송"(3번)입니다.

PYTHON
# 3. 워드클라우드
from wordcloud import WordCloud
import matplotlib.pyplot as plt

text = "good good service fast delivery good"
wc = WordCloud(background_color="white").generate(text)
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()

나오는 그래프: "good"이 가장 크게, "service"·"fast"·"delivery"가 작게 표시됩니다.

이 장에서 배운 것

  • 텍스트 분석은 전처리(다듬기)가 절반이다.
  • .str 접근자로 문자열 메서드를 열 전체에 적용한다(strip·contains·replace·split).
  • 토큰화는 문장을 단어로 쪼개는 것이며, 공백 분리가 가장 간단하다.
  • 불용어는 의미 없는 흔한 단어로, ~series.isin(불용어)로 거른다.
  • 워드클라우드로 빈출 단어를 크기로 시각화한다(한글은 폰트 지정 필요).

✍️ 확인 문제

  1. 텍스트 데이터에서 "전처리"가 특히 중요한 이유는 무엇인가요?
  2. ~words.isin(stopwords)에서 ~는 무슨 역할을 하나요?
  3. 워드클라우드에서 단어의 크기는 무엇을 나타내나요?

🎉 본문을 모두 마쳤습니다!

0부 기초부터 시작해 시리즈·데이터프레임·정리·합치기·그룹화·시각화·시계열·텍스트까지, 데이터 분석의 한 바퀴를 완주했습니다. 이제 여러분은:

다음 단계로는 실제 관심 있는 데이터(공공데이터, Kaggle 등)를 골라 이 안내서의 흐름대로 직접 분석해 보는 것을 강력히 권합니다. 손으로 부딪히는 것이 가장 빠른 성장의 길입니다.

📚 모르는 용어가 나오면 부록 C(고유 용어집)부록 D(기초 기술 용어 사전)에서 찾아보세요.
🏠 처음(목차)으로 돌아가기