안녕하세요! 두부쌤
입니다~ 
저는 최근에 심리학 부전공 연수를 수강하면서 인간의 행동과 감정을 과학적으로 탐구하는 심리학의 매력에 깊이 빠지게 되었습니다. 심리학의 다양한 분야 중에서 가장 흥미로웠던 것은 사회심리학입니다.
사회심리학은 사회적 상황이 개인에 어떤 영향을 미치는지를 다루는 영역으로, 우리의 일상 속 다양한 사회적 현상을 이해하는 데 도움을 줍니다.
오늘은, 이 사회심리학과 데이터 분석을 융합해서 진행할 수 있는 실습형 수업의 전체적인 흐름을 간단하게 소개해 드리려고 합니다.
사회심리학이란?
사회심리학은 사회적 상황 요인이 개인의 행동, 생각, 느낌에 어떤 영향을 미치는지, 그리고 개인과 공동체 간의 상호작용은 어떻게 이루어지는지를 연구하는 분야입니다.
시회심리학 안에서도 오늘 다룰 주제는 바로 동조(comformity)입니다.
사람들은 타인의 행동이나 의견에 따라 움직이는가를 확인해 보는 것입니다.
이러한 사회심리학 개념 ‘동조(comformity)’를 데이터 분석과 연결하여 주제를 선정해 보았습니다.
유튜브에 축적된 데이터를 활용하여 분석을 진행할 예정입니다.
유튜브는 매분 360시간 이상, 하루 52만 시간 이상의 영상이 생성되고 있다고 합니다.
그만큼 많은 사람들이 유튜브를 통해 생각과 감정을 표현하며 서로 소통하고 있기에, 사회적 현상을 관찰할 수 있는 아주 거대한 데이터 공간이라고 할 수 있습니다.
이러한 유튜브를 활용한다면 심리학에서 다루는 내용을 일상 속 데이터로 직접 확인해 볼 수 있습니다!
다음과 같은 수업 주제를 생각해 볼 수 있습니다.
•
부정적인 댓글이 하나 등장하면 이후 댓글들도 부정적인 내용이 늘어나는가?
→ 초기 댓글의 정서가 이후 댓글의 분위기에 영향을 주는지 분석
•
전체 댓글의 감정 분위기(긍정·부정 비율)가 다른 사람의 댓글 감정에 영향을 주는가?
→ ‘다수의 의견’에 동조하는 패턴이 나타나는지 확인
•
좋아요가 많은 댓글의 정서가 전체 댓글 분위기에 영향을 미치는가?
→ 대표 의견이 동조를 강화하는지 확인
이 중에서 마지막
‘좋아요’가 많은 댓글의 정서가 전체 댓글 분위기에 영향을 미치는가?’를
주제로, ‘좋아요’ 상위 10% 댓글과 전체 댓글의 감정 분포를 비교하여 상위 댓글의 정서가 전체적인 분위기에 어떤 영향을 미치는지를 구글 코랩을 활용하여 가볍게 분석해 보도록 하겠습니다.
전체 절차는 다음과 같습니다.
1.
데이터 수집
2.
데이터 전처리
3.
감정분석
4.
시각화
5.
해석
1단계 : 데이터 수집
분석하고자 하는 주제와 관련된 영상을 선택하고, 댓글 데이터를 수집합니다.
댓글이 많을수록 분석 결과가 풍부해집니다!
데이터 수집은 파이썬 라이브러리 youtube-comment-downloader를 활용하겠습니다.
이 라이브러리는 유튜브 영상의 댓글을 쉽게 크롤링할 수 있도록 도와줍니다.
그럼 코랩에서 같이 실습을 진행해 보록 하겠습니다~
다음 코드를 통해 라이브러리를 설치합니다.
pip install youtube-comment-downloader
Python
복사
라이브러리를 통해 ‘좋아요’ 순으로 댓글을 가져온 후 pandas의 데이터프레임 형태로 저장합니다.
(영상은 임의로 한 개 선택했습니다~)
from youtube_comment_downloader import YoutubeCommentDownloader
import pandas as pd
#다운로더 객체 생성
dl = YoutubeCommentDownloader()
#좋아요순(Top comments)으로 댓글 가져오기 (최대 300개)
comments = dl.get_comments_from_url(
"https://www.youtube.com/watch?v=영상ID",
sort_by=0 # 0=좋아요순, 1=최신순
)
#DataFrame으로 변환
#댓글 ID는 개인정보 보호를 위해 가져오지 않았습니다
data = []
for i, c in enumerate(comments):
data.append({
'댓글내용': c['text'],
'좋아요수': c['votes'],
'작성시간': c['time']
})
if i >= 299: # 최대 300개까지만
break
# DataFrame 변환
df = pd.DataFrame(data)
#상위 5개 데이터 확인
print(df.head())
Python
복사
이렇게 코드를 실행하면 다음과 같이 데이터 프레임(df)이 잘 만들어진 것을 확인할 수 있습니다.
(sort_by=0에서는 영상을 만든 사람이 고정한 댓글은 ‘좋아요’순/’최신’순과 무관하게 항상 1순위로 고정되어 먼저 저장됩니다. )
2단계 : 데이터 전처리
먼저, 고정한 댓글은 영상 제작자가 의도적으로 상단에 띄워둔 의견이기에 외부에서 조작된 요인(사회적 권위)으로 작동합니다.
따라서 자연스럽게 만들어진 댓글만 남기기 위해 제거하겠습니다.
df = df.iloc[1:]
print(df.head())
Python
복사
데이터 프레임의 각 속성 타입을 알아보겠습니다.
df.info()
Python
복사
‘좋아요’수 자체로서 상위 10%를 추출하려면 타입을 숫자로 바꾸어야 하나,
이미 ‘좋아요’가 많은 순서대로 정렬되어 있기 때문에 인덱스를 통해 상위 10%를 추출할 수 있습니다.
따라서 타입을 변환하지 않고 남은 전처리 과정을 진행하겠습니다.
import re
import pandas as pd
#결측치 제거 (댓글이 비어있는 경우 제외)
df = df.dropna(subset=['댓글내용'])
#중복 제거 (같은 댓글 여러 번 등장 방지)
df = df.drop_duplicates(subset=['댓글내용'])
#텍스트 정제 함수 정의
def clean_text(text):
text = re.sub(r"http\S+|www\S+", "", text) # URL 제거
text = re.sub(r"[^\w\s]", "", text) # 특수문자 제거
text = re.sub(r"\s+", " ", text) # 불필요한 공백 제거
return text.strip()
#댓글 내용 정제 적용
df['댓글내용'] = df['댓글내용'].apply(clean_text)
#상위 10% 추출 (이미 좋아요순 정렬되어 있으므로 인덱스로 자름)
n = len(df)
top_10_percent = int(n * 0.1)
top_comments = df.iloc[:top_10_percent]
print(f"전체 댓글 수: {len(df)}개")
print(f"상위 10% 댓글 수: {len(top_comments)}개")
#확인
print(top_comments.head())
Python
복사
3단계: 데이터 분석 단계
이제 상위 댓글의 감정과 전체 댓글의 감정을 분석해 보겠습니다.
감정 분석은 bert-base-multilingual-uncased-sentiment 모델을 사용하겠습니다.
이 모델은 다국어 감정 분석에 특화되어 있으며, 텍스트를 1~5점 (1=매우 부정, 3=중립, 5=매우 긍정)으로 분류합니다.
먼저 감정 분석에 필요한 라이브러리를 설치합니다.
!pip install transformers torch tqdm
Python
복사
모델을 활용해 감정 분석을 해보겠습니다.
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
import torch.nn.functional as F
import pandas as pd
from tqdm import tqdm
#모델 불러오기
MODEL = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(MODEL)
model = AutoModelForSequenceClassification.from_pretrained(MODEL)
#감정 점수 예측 함수 정의
def get_sentiment_score(text):
if not isinstance(text, str) or text.strip() == "":
return None
tokens = tokenizer(text, return_tensors='pt', truncation=True, max_length=256)
with torch.no_grad():
output = model(**tokens)
probs = F.softmax(output.logits, dim=-1)
score = torch.argmax(probs).item() + 1 # 0~4 → 1~5
return score
#데이터 적용
tqdm.pandas()
df['감정점수'] = df['댓글내용'].progress_apply(get_sentiment_score)
#상위 10% 댓글과 전체 댓글 비교
n = len(df)
top_10_percent = int(n * 0.1)
top_comments = df.iloc[:top_10_percent]
print("전체 평균:", df['감정점수'].mean())
print("상위 10% 평균:", top_comments['감정점수'].mean())
Python
복사
4단계 : 시각화
분석한 결과를 시각화 해보겠습니다.
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8,5))
sns.kdeplot(df['감정점수'], label='전체 댓글')
sns.kdeplot(top_comments['감정점수'], label='좋아요 상위 10%', color='red')
plt.title("좋아요 상위 10% vs 전체 댓글 감정 분포 (1=부정, 5=긍정)")
plt.legend()
plt.show()
Python
복사
5단계 : 해석
그래프를 보면 전체 댓글의 감정 점수 평균은 3.37점, 상위 10% 댓글의 평균은 3.4점 입니다.
두 집단 모두 전반적으로 긍정적 감정에 분포하고 있습니다.
상위 댓글의 감정 분포가 전체보다 약간 더 오른쪽으로 이동해있으며, 전체 집단의 감정 분포와 유사한 형태를 보이고 있습니다.
이는 상위 집단의 정서가 전체 댓글의 정서적 방향성을 형성했을 가능성을 보여줍니다.
다시 말해, ‘좋아요’가 많은 상위 댓글이 정서적 기준으로 작용하여 다른 댓글들이 이에 정서적으로 동조하거나 수렴하는 패턴이 관찰되었을 가능성을 나타냅니다.
(물론 하나의 영상으로 이러한 결론을 일반화하는 것은 한계가 있습니다...)
조금 부정적인 댓글이 많은 영상으로 똑같은 과정을 진행해보았습니다~
이처럼 오늘은 심리학과 데이터 분석을 융합한 수업을 보여드렸습니다.
댓글 데이터를 통해 사람들의 정서적 동조 현상을 직접 분석해 보니
숫자 뒤에 숨은 심리학적 의미와 인간 행동의 패턴을 함께 살펴볼 수 있었습니다.
조금 더 자세히 다루고 싶은 부분이 많았는데,
나중에 기회가 된다면 다른 주제까지 확장해서 진행해 보도록 하겠습니다!
오늘도 함께해 주셔서 감사합니다. 
두부쌤
이었습니다!






