티스토리 뷰
54일차) 내일배움캠프 데이터 분석 TIL - Tableau(2), QCC(2), AI 활용 텍스트 데이터 분석(2)
heeso0908 2026. 3. 13. 20:49AI 활용 텍스트 데이터 분석
이번에 텍스트 분석을 배우면서, 단순히 글을 읽는 것이 아니라 텍스트를 데이터처럼 다루는 방법을 익힐 수 있었다.
실습은 크게 두 가지 흐름으로 진행됐다. 하나는 텍스트 빈도 분석, 다른 하나는 BERT 기반 텍스트 분류였다.
앞의 실습에서는 전통적인 자연어 처리 방식으로 텍스트를 정리하고 핵심 단어를 뽑아보았고, 뒤의 실습에서는 딥러닝 모델을 활용해 문장의 감성을 분류해보았다.
1. 텍스트 빈도 분석 실습
첫 번째 실습에서는 자세교정 밴드 제품 리뷰 데이터를 활용했다.
약 1,500건의 리뷰 데이터를 대상으로 분석을 진행했고, 별점은 1점부터 5점까지 있었으며 4~5점은 긍정, 1~3점은 부정으로 나누어 살펴보았다.
이 실습에서 가장 먼저 배운 것은 텍스트 전처리의 중요성이었다.
텍스트는 숫자 데이터와 다르게 그대로 넣으면 노이즈가 많아서, 분석 전에 반드시 정리 과정을 거쳐야 한다.
이번 실습에서는 다음과 같은 순서로 전처리를 진행했다.
- HTML 태그, URL, 특수문자 제거
- 반복 문자 정규화
- 형태소 분석
- 불용어 제거
- 최종적으로 분석 가능한 형태의 문자열로 변환
특히 한국어는 영어처럼 공백만으로 단어를 자르기 어렵기 때문에, 형태소 분석이 중요하다는 점이 인상적이었다.
이번에는 Kiwi 형태소 분석기를 사용해서 명사와 형용사 중심으로 토큰을 추출했다.
그 과정에서 “텍스트 분석은 모델을 돌리기 전에 전처리 품질이 결과를 많이 좌우한다”는 점을 직접 느낄 수 있었다.
2. 빈도 분석으로 핵심 단어 파악하기
전처리가 끝난 뒤에는 CountVectorizer를 활용해 단어 빈도를 확인했다.
여기서 unigram, bigram, 그리고 unigram+bigram을 함께 살펴보며 텍스트를 다양한 단위로 해석할 수 있었다.
예를 들어 unigram에서는 개별 단어의 등장 횟수를 볼 수 있고, bigram에서는 두 단어가 연달아 등장하는 패턴을 확인할 수 있다.
실습 결과 상위에 등장한 표현들을 보면, 리뷰 전반에서 제품의 핵심 관심사가 무엇인지 한눈에 드러났다.
예를 들어 자세, 어깨, 교정, 허리 같은 단어가 자주 나타났고, bigram에서는 자세 교정, 바른 자세, 어깨 허리 같은 조합이 많이 등장했다.
이 과정을 통해 단순히 “어떤 단어가 많이 나왔는가”를 보는 데서 끝나는 것이 아니라,
사용자들이 제품을 어떤 맥락에서 이야기하고 있는지까지 파악할 수 있다는 점이 흥미로웠다.
3. TF-IDF로 중요한 키워드 찾기
빈도만 보면 자주 등장하는 단어를 찾을 수 있지만,
모든 문서에서 공통적으로 많이 나오는 단어는 오히려 분석에 큰 도움이 되지 않을 수도 있다.
그래서 이번에는 TF-IDF를 활용해 각 그룹에서 더 의미 있는 단어를 추출했다.
TF-IDF는 한 문서 안에서는 자주 등장하지만, 전체 문서에서는 흔하지 않은 단어에 높은 점수를 부여하는 방식이다.
즉, 단순히 많이 나온 단어가 아니라 그 문서를 더 잘 대표하는 단어를 찾는 데 적합하다.
긍정 리뷰와 부정 리뷰를 나누어 TF-IDF를 비교해보니,
긍정 쪽에서는 자세, 어깨, 교정, 편하, 만족 같은 단어가 상대적으로 중요하게 나타났고,
부정 쪽에서는 반품, 약하, 찍찍이, 불편, 겨드랑이 같은 단어가 두드러졌다.
이 부분이 특히 인상적이었던 이유는,
단순히 긍정/부정 여부를 구분하는 것을 넘어 고객이 어떤 포인트에서 만족하고, 어떤 포인트에서 불만을 느끼는지를 구체적으로 알 수 있었기 때문이다.
실무에서도 리뷰 분석이나 VOC 분석에 바로 연결될 수 있는 방식이라고 느꼈다.
4. 워드클라우드와 시각화
텍스트 분석 결과를 더 직관적으로 보기 위해 워드클라우드도 생성했다.
워드클라우드는 많이 등장한 단어를 크게 보여주기 때문에, 데이터를 처음 보는 사람도 전체 흐름을 빠르게 이해할 수 있다.
또한 별점별 키워드 변화도 함께 살펴보면서,
1점 리뷰와 5점 리뷰에서 어떤 단어가 두드러지는지 비교해볼 수 있었다.
예를 들어 낮은 별점에서는 불편함, 약함, 반품 같은 표현이 보이고, 높은 별점에서는 자세, 교정, 편안함, 만족 같은 표현이 중심이 되는 흐름을 확인할 수 있었다.
이런 시각화는 분석 내용을 전달할 때 특히 유용했다.
텍스트 분석은 결과가 숫자만으로 보이면 다소 추상적으로 느껴질 수 있는데,
워드클라우드나 막대그래프, 히트맵 같은 시각화를 함께 사용하면 훨씬 이해하기 쉬워진다는 점을 배웠다.
5. 동시출현 분석으로 단어 관계 보기
이번 실습에서는 단어 빈도만 보는 데서 더 나아가 동시출현(Co-occurrence) 분석도 진행했다.
동시출현 분석은 같은 문서 안에서 함께 등장하는 단어 쌍을 찾아서, 단어들 사이의 관계를 파악하는 방법이다.
예를 들어 어깨-자세, 교정-자세, 어깨-허리처럼 함께 자주 등장하는 단어 조합을 확인할 수 있었다.
이 결과를 네트워크 그래프로 시각화하면, 단어들이 서로 어떤 주제를 중심으로 묶이는지도 볼 수 있다.
이 부분을 통해 텍스트 분석은 단순히 단어를 세는 작업이 아니라,
단어 간의 연결 구조와 의미망까지 볼 수 있는 분석이라는 점을 이해하게 되었다.
6. BERT 기반 텍스트 분류 실습
두 번째 실습에서는 딥러닝 기반의 텍스트 분류 모델인 BERT 계열 모델을 활용했다.
첫 번째 실습이 단어 빈도와 키워드 중심이었다면, 두 번째 실습은 문장의 문맥을 이해하는 모델을 다뤘다는 점에서 차이가 있었다.
기존의 TF-IDF 방식은 단어의 등장 여부나 빈도를 기반으로 텍스트를 표현하기 때문에,
문장의 흐름이나 부정 표현을 정확히 반영하기 어렵다.
예를 들어 “재미있다”와 “재미없다”는 비슷한 단어를 포함하지만 실제 의미는 완전히 다르다.
이런 한계를 보완하기 위해 BERT 같은 모델이 사용된다.
실습에서는 Hugging Face의 pipeline()을 이용해 감성 분류를 쉽게 적용해보았고,
영어 감성 분류를 먼저 체험한 뒤 한국어 모델로 확장했다.
한국어에서는 KoELECTRA 기반 모델을 사용해 감성 분류를 수행했다.
7. BERT에서는 왜 전처리를 덜 할까?
첫 번째 실습과 비교했을 때 가장 흥미로웠던 점은,
BERT 계열 모델에서는 TF-IDF 실습처럼 복잡한 전처리를 하지 않는다는 점이었다.
TF-IDF에서는 정제, 정규화, 형태소 분석, 불용어 제거가 중요한 반면,
BERT는 자체 토크나이저를 가지고 있어서 원문 텍스트를 비교적 그대로 입력해도 된다.
즉, 전통적인 NLP에서는 사람이 직접 규칙을 만들어 텍스트를 정리하는 비중이 컸다면,
딥러닝 기반 NLP에서는 모델이 문맥을 학습하기 때문에 전처리 방식 자체가 달라진다.
이 차이를 비교하면서,
텍스트 분석에서도 분석 목적과 모델에 따라 전처리 전략이 달라진다는 점을 분명히 이해할 수 있었다.
8. 모델 평가와 비교
텍스트 분류 실습에서는 분류 결과를 단순히 예측만 해보는 것이 아니라,
Accuracy, Precision, Recall, F1-score 같은 지표를 통해 모델 성능을 평가하는 과정도 함께 진행했다.
또한 혼동행렬을 통해 어떤 유형의 오류가 발생하는지도 시각적으로 확인했다.
추가로 서로 다른 한국어 모델을 비교해보면서,
모델의 크기나 학습 데이터의 특성에 따라 성능 차이가 날 수 있다는 점도 확인했다.
같은 계열 모델이라도 어떤 데이터로 학습되었는지에 따라 결과 해석이 달라질 수 있기 때문에,
단순히 “성능이 높다/낮다”가 아니라 모델의 학습 배경까지 함께 보는 시각이 필요하다는 점을 배웠다.
9. 사전학습과 파인튜닝의 차이
실습 후반부에서는 이미 학습된 모델을 바로 쓰는 데서 그치지 않고,
직접 학습하는 방식도 비교해보았다.
- 랜덤 초기화 후 처음부터 학습
- 사전학습된 모델을 파인튜닝
- Encoder를 동결하고 분류 헤드만 학습
이 세 가지 방식을 비교하면서,
왜 사전학습된 언어모델이 강력한지 더 잘 이해할 수 있었다.
소량의 데이터만 있을 때는 처음부터 새로 학습하는 것보다,
이미 언어 지식을 가진 모델을 가져와 미세 조정하는 편이 훨씬 효율적이라는 점이 핵심이었다.
이 부분은 단순히 실습을 넘어서,
실무에서 왜 거대 언어모델이나 사전학습 모델을 적극적으로 활용하는지 이해하는 데도 도움이 됐다.
10. 이번 실습을 통해 느낀 점
이번 텍스트 분석 실습을 통해 가장 크게 느낀 점은,
텍스트도 충분히 정량적으로 분석 가능한 데이터라는 것이다.
처음에는 문장 데이터를 숫자로 바꾸고 분석한다는 개념이 낯설었지만,
전처리 → 벡터화 → 키워드 추출 → 시각화 → 분류 및 평가의 흐름을 직접 따라가보니
텍스트 분석의 전체 구조가 훨씬 선명하게 보였다.
또한 전통적인 방식인 TF-IDF와 딥러닝 기반 방식인 BERT를 비교해보면서,
각 접근 방식의 장단점을 함께 이해할 수 있었다.
- TF-IDF는 해석이 쉽고 빠르다
- BERT는 문맥을 더 잘 반영한다
- 목적에 따라 적절한 방법을 선택하는 것이 중요하다
결국 텍스트 분석은 단순히 모델을 돌리는 것이 아니라,
데이터를 어떻게 정리하고, 어떤 질문을 던지고, 결과를 어떻게 해석할 것인가가 더 중요하다는 점을 배우게 된 실습이었다.
QCC 2회차
Q1.



select
c.last_name,
c.first_name,
count(c.customer_id) as order_count,
sum(i.total) as total_spent
from chinook_customers as c
join invoices as i
on c.customer_id = i.customer_id
group by c.customer_id
having count(c.customer_id) >= 7 and sum(i.total) > 40.62
order by total_spent desc;
# 내가 작성한 쿼리
select cc.last_name, cc.first_name, count(invoice_id) invoices, sum(total) total
from chinook_customers cc
join invoices i
on cc.customer_id = i.customer_id
group by 1
-- group by cc.last_name, cc.first_name
having count(invoice_id >= 7
and sum(total) > 40.62
order by 4 desc
# 정답 쿼리

Q2.



select track_id
from track_details
where track_id not in (select track_id from invoice_line)
and media_type_id = 1
order by track_id;
# 내가 작성한 쿼리
SELECT t.track_id
FROM qcc.track_details t
LEFT JOIN qcc.invoice_line ii ON t.track_id = ii.track_id
WHERE t.media_type_id = 1
AND ii.track_id IS NULL
ORDER BY t.track_id
# 정답 쿼리
Q3.




select name
from track_details
where album_id = (
select t.album_id
from track_details as t
join invoice_line as l
on t.track_id = l.track_id
join invoices as i
on l.invoice_id = i.invoice_id
where substr(i.invoice_date, 1, 4) = 2025
group by t.album_id
order by sum(l.unit_price * quantity) desc
limit 1)
order by name
# 내가 작성한 쿼리
WITH top_album AS (
SELECT td.album_id
FROM qcc.invoices i
JOIN qcc.invoice_line il ON i.invoice_id = il.invoice_id
JOIN qcc.track_details td ON il.track_id = td.track_id
WHERE date_format(i.invoice_date, '%Y-%m-%d') BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY td.album_id
ORDER BY SUM(il.unit_price * il.quantity) DESC
LIMIT 1
)
SELECT name
FROM qcc.track_details
WHERE album_id = (SELECT album_id FROM top_album)
ORDER BY name
# 정답 쿼리

'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 56일차) 내일배움캠프 데이터 분석 TIL - Tableau(4), AI 활용 텍스트 데이터 분석(4) (0) | 2026.03.17 |
|---|---|
| 55일차) 내일배움캠프 데이터 분석 TIL - Tableau(3), AI 활용 텍스트 데이터 분석(3) (1) | 2026.03.16 |
| 심화 프로젝트) 다이캐스팅 공정 불량 탐지 모델 개발 프로젝트 (1) | 2026.03.12 |
| 53일차) 내일배움캠프 데이터 분석 TIL - Tableau(1), AI 활용 텍스트 데이터 분석(1) (0) | 2026.03.12 |
| 47일차) 내일배움캠프 데이터 분석 TIL - 심화 프로젝트(3) (0) | 2026.03.04 |
- Total
- Today
- Yesterday
- 비전공자코딩
- github
- 통계
- 데이터분석입문
- SQL
- Tableau
- Til
- 태블로
- git
- 파이썬
- 구글코랩
- 텍스트분석
- 머신러닝
- 코딩처음
- GoogleColab
- 코드카타
- 데이터시각화
- 코딩기초
- 중학생코딩
- 파이썬입문
- 내일배움캠프
- 데이터분석
- Python
- 프로그래밍입문
- 판다스
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
