18. 텍스트 데이터 분석
- 텍스트(글자) 데이터를 불러와 살펴본다
- 문자열을 다듬는다(대소문자·공백·기호 제거)
- 토큰화·불용어 제거로 단어를 정리한다
- 워드클라우드로 자주 나온 단어를 시각화한다
먼저: 텍스트 데이터는 왜 따로 다루나요?
숫자는 바로 평균·합계를 낼 수 있지만, 글은 그렇지 않습니다. "좋아요!"와 "좋아요", "좋아요 "(뒤 공백)는 사람 눈엔 같지만 컴퓨터엔 다른 글자입니다. 그래서 텍스트 분석은 정리(전처리)가 절반입니다. 대소문자를 통일하고, 불필요한 기호·공백을 없애고, 의미 없는 단어를 걸러내는 과정을 거칩니다.
🔑 새 용어 — 전처리(preprocessing)
분석 전에 데이터를 분석하기 좋은 상태로 다듬는 모든 작업입니다. 12장의 결측치 처리도 전처리의 일종이고, 텍스트에선 특히 비중이 큽니다.
문자열 다듬기 — Pandas의 .str
0부에서 본 문자열 메서드(upper, strip 등)를 Pandas에서는 .str을 붙여 열 전체에 한 번에 적용합니다.
import pandas as pd reviews = pd.Series([" 맛있어요!! ", "별로...", "다시 올게요^^", "맛있어요"]) print(reviews.str.strip()) # 양 끝 공백 제거 print("---") print(reviews.str.len()) # 각 글자 길이 print("---") print(reviews.str.contains("맛있")) # '맛있' 포함 여부
실행 결과:
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에 정규식을 쓸 수 있습니다.
import pandas as pd reviews = pd.Series(["맛있어요!!", "별로...", "다시 올게요^^"]) # 한글·공백만 남기고 나머지(기호) 제거 cleaned = reviews.str.replace(r"[^가-힣\s]", "", regex=True) print(cleaned)
실행 결과:
0 맛있어요 1 별로 2 다시 올게요 dtype: object
🔑 새 용어 — 정규식(정규 표현식, regex)
글자 패턴을 표현하는 작은 규칙 언어입니다. 위의[^가-힣\s]는 "한글(가~힣)과 공백(\s)이 아닌 모든 것"을 뜻해서, 그것들을 빈 문자열로 바꿔(=지워) 줍니다. 정규식은 처음엔 어렵지만, "기호 제거" 같은 패턴은 외워 두면 유용합니다. 지금은 깊이 몰라도 괜찮습니다.
토큰화 — 문장을 단어로 쪼개기
🔑 새 용어 — 토큰화(tokenization)
문장을 단어(토큰) 단위로 쪼개는 것입니다. "나는 파이썬을 좋아해" → ["나는", "파이썬을", "좋아해"]. 단어별로 세거나 분석하려면 먼저 토큰화가 필요합니다. 여기서 "토큰(token)"은 쪼개진 한 조각(보통 한 단어)을 뜻합니다.
가장 간단한 토큰화는 공백 기준 분리입니다. .str.split()을 씁니다.
import pandas as pd s = pd.Series(["나는 파이썬을 좋아해", "데이터 분석은 재미있어"]) print(s.str.split())
실행 결과:
0 [나는, 파이썬을, 좋아해] 1 [데이터, 분석은, 재미있어] dtype: object
단어 빈도 세기
토큰을 모두 펼쳐서 어떤 단어가 자주 나왔는지 셉니다. 14장의 value_counts를 활용합니다.
import pandas as pd texts = pd.Series([ "파이썬 좋아 파이썬 재미", "데이터 파이썬 분석", "분석 재미 데이터" ]) # 모든 텍스트를 합쳐 단어로 쪼갬 all_words = " ".join(texts).split() word_counts = pd.Series(all_words).value_counts() print(word_counts)
실행 결과:
파이썬 3 데이터 2 분석 2 재미 2 좋아 1 dtype: int64
읽는 법: " ".join(texts)로 모든 글을 하나로 잇고 → .split()으로 단어를 쪼갠 뒤 → value_counts()로 빈도를 셌습니다. "파이썬"이 3번으로 가장 많네요.
불용어 제거
🔑 새 용어 — 불용어(stopword)
"은/는/이/가/그리고/the/a/is"처럼 자주 나오지만 의미 분석엔 도움이 안 되는 단어입니다. 빈도를 세면 이런 단어가 상위를 차지해 분석을 흐리므로, 미리 제거합니다.
import pandas as pd words = pd.Series(["나는", "파이썬", "이", "좋다", "그리고", "데이터", "는", "재미있다"]) stopwords = ["나는", "이", "그리고", "는", "은", "가", "를", "을"] filtered = words[~words.isin(stopwords)] # 불용어가 '아닌' 것만 print(filtered)
실행 결과:
1 파이썬 3 좋다 5 데이터 7 재미있다 dtype: object
🔑 새 용어 —isin과~
isin(목록): 각 값이 목록에 들어 있는지 참/거짓으로 알려 줍니다.~(물결): 참/거짓을 뒤집습니다(NOT). 그래서~words.isin(stopwords)는 "불용어 목록에 없는 것"이 되어, 불용어를 걸러냅니다.
워드클라우드: 자주 나온 단어를 그림으로
🔑 새 용어 — 워드클라우드(word cloud)
자주 나온 단어일수록 크게 표시해, 텍스트의 핵심을 한눈에 보여 주는 그림입니다. 후기·기사 등에서 "무엇이 가장 많이 언급됐나"를 직관적으로 전달합니다.
Colab에는 워드클라우드 라이브러리가 보통 깔려 있습니다. 없다면 !pip install wordcloud로 설치합니다(!로 시작하면 설치 명령).
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()
나오는 그래프: 흰 바탕에 단어들이 흩어진 그림이 나옵니다. 가장 많이 나온 "파이썬"이 가장 크게, 그다음 "데이터"·"분석"이 중간 크기로 표시됩니다.
WordCloud(font_path="한글폰트경로.ttf", ...)로 한글 폰트를 지정해야 합니다(Colab에서 나눔폰트 등을 설치해 경로를 줌). 영어 텍스트는 폰트 지정 없이 바로 됩니다.불용어를 빼고 그릴 수도 있습니다.
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" 같은 단어를 자동으로 빼고 그려 줍니다.
🛠 미니 챌린지
import pandas as pd comments = pd.Series([ "배송 빠르고 좋아요", "품질 좋아요 배송도 빠름", "그냥 그래요 배송 느림" ])
- 모든 댓글을 공백으로 토큰화해 단어 리스트를 만드세요.
- 단어별 빈도를 세어 출력하세요. 가장 많이 나온 단어는?
- (도전) 영어 텍스트
"good good service fast delivery good"로 워드클라우드를 그려 보세요.
✅ 미니 챌린지 해설
import pandas as pd comments = pd.Series([ "배송 빠르고 좋아요", "품질 좋아요 배송도 빠름", "그냥 그래요 배송 느림" ]) # 1. 토큰화 + 2. 빈도 all_words = " ".join(comments).split() counts = pd.Series(all_words).value_counts() print(counts)
실행 결과:
배송 3 좋아요 2 빠르고 1 품질 1 배송도 1 빠름 1 그냥 1 그래요 1 느림 1 dtype: int64
가장 많이 나온 단어는 "배송"(3번)입니다.
# 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(불용어)로 거른다. - 워드클라우드로 빈출 단어를 크기로 시각화한다(한글은 폰트 지정 필요).
✍️ 확인 문제
- 텍스트 데이터에서 "전처리"가 특히 중요한 이유는 무엇인가요?
~words.isin(stopwords)에서~는 무슨 역할을 하나요?- 워드클라우드에서 단어의 크기는 무엇을 나타내나요?
🎉 본문을 모두 마쳤습니다!
0부 기초부터 시작해 시리즈·데이터프레임·정리·합치기·그룹화·시각화·시계열·텍스트까지, 데이터 분석의 한 바퀴를 완주했습니다. 이제 여러분은:
- 설치 없이 Colab에서 데이터를 불러오고
- 데이터프레임으로 표를 다루고
- 결측치를 정리하고 합치고 그룹별로 요약하고
- Matplotlib·Seaborn으로 시각화하고
- 날짜와 텍스트까지 다룰 수 있습니다.
다음 단계로는 실제 관심 있는 데이터(공공데이터, Kaggle 등)를 골라 이 안내서의 흐름대로 직접 분석해 보는 것을 강력히 권합니다. 손으로 부딪히는 것이 가장 빠른 성장의 길입니다.
📚 모르는 용어가 나오면 부록 C(고유 용어집)와 부록 D(기초 기술 용어 사전)에서 찾아보세요.
🏠 처음(목차)으로 돌아가기