← 전체 해설 목록  ·  week-01 · 6강

6강 — 실습: Steam 리뷰 수집 + 파이썬 기초

🎯 학습 목표

📖 해설

1. 오늘의 목표 & 흐름

이 강이 끝나면 여러분은 Steam에서 리뷰를 수집해 CSV 파일로 저장할 수 있게 됩니다. 6단계로 가요. 복습 → 설치 → 게임 ID 찾기 → 수집 → 확인 → 저장(CSV).

코드의 문법에 매달리지 말고 "어떤 일을, 어떤 순서로 하는가"에 집중하세요.

이번 수집은 안전할까요? 네, 안전합니다. Steam 공식 API를 쓰고, steamreviews가 rate limit을 알아서 지켜주거든요(5강 체크리스트의 공식 API·속도제한·비상업을 모두 충족해요).

2. 수집 실습 흐름 (직접 실행)

아래 코드를 Colab 셀에 차례로 붙여넣으면 됩니다. (실행용 노트북: notebooks/6강_실습.ipynb)

① 라이브러리 설치

!pip install -q steamreviews

② 게임 ID 지정 — 게임 ID는 Steam이 게임마다 붙여 둔 고유 번호예요. 찾는 법은 네 단계입니다. 1. Steam 상점(store.steampowered.com)에 접속하고 → 2. 원하는 게임을 검색한 뒤 → 3. 상점 페이지로 들어가서 → 4. 주소창 URL의 /app/숫자/에서 그 숫자를 확인하면 됩니다.

예를 들어 스타듀밸리 상점 URL이 https://store.steampowered.com/app/413150/Stardew_Valley/라면 게임 ID는 413150이에요. 자주 쓰는 게임 ID 몇 개를 적어 둘게요.

게임 게임 ID
스타듀밸리(Stardew Valley) 413150
어몽어스(Among Us) 945360
사이버펑크 2077(Cyberpunk 2077) 1091500
app_id = 413150   # 분석할 게임의 Steam ID

③ 리뷰 수집 — 한국어 리뷰. 리뷰가 많으면 몇 분 걸린다

import steamreviews

# 한국어 리뷰만 요청 (영어까지 받으려면 "language"를 "all"로)
params = {"language": "korean"}
# 반환값은 두 개예요: 리뷰 딕셔너리, API를 몇 번 호출했는지(query_count)
review_dict, query_count = steamreviews.download_reviews_for_app_id(
    app_id,
    chosen_request_params=params,
)

reviews = review_dict["reviews"]      # {리뷰ID: 리뷰정보} 형태의 딕셔너리
print("수집된 리뷰 수:", len(reviews))
print("API 요청 횟수:", query_count)   # 내부에서 몇 번 나눠 받았는지

함수가 돌려주는 값이 두 개라는 점에 주목하세요. 첫 번째가 우리가 쓸 리뷰 딕셔너리이고, 두 번째 query_count는 이 라이브러리가 Steam에 몇 번 나눠서 요청을 보냈는지를 알려줍니다. Steam은 한 번에 약 20개씩만 주기 때문에, 리뷰가 많은 게임이면 내부에서 페이지를 여러 번 받아 오느라 호출 횟수가 늘어나는 거예요.

리뷰가 수만 건인 인기작은 전부 받으면 시간이 오래 걸립니다. 연습 단계에서는 일부만 빠르게 받아 구조를 익히는 게 효율적이에요. query_count 인자로 API 호출 횟수에 상한을 두면 됩니다(1회면 대략 100개 안팎).

# 연습용: API 호출을 1회로 제한해 약 100개만 빠르게 받기
review_dict, query_count = steamreviews.download_reviews_for_app_id(
    app_id,
    chosen_request_params=params,
    query_count=1,
)
print("수집된 리뷰 수:", len(review_dict["reviews"]))

참고로 steamreviews는 요청이 일정 횟수(약 150회)를 넘으면 자동으로 몇 분간 쉬어 가며(cooldown) Steam의 속도제한을 지킵니다. "한참 멈춘 듯 보이는" 건 오류가 아니라 라이브러리가 규칙을 지키는 중인 거예요. 그래서 전체 수집은 시간이 걸리고, 연습 땐 위처럼 상한을 두는 게 좋습니다.

④ 데이터 구조 먼저 살펴보기 — 표로 바꾸기 전에, 리뷰 하나에 어떤 정보가 들어 있는지부터 확인하세요. 재료를 받으면 뭐가 들었는지 먼저 보는 것과 같아요.

# 첫 번째 리뷰 하나만 꺼내서 어떤 필드(키)가 있는지 확인
first_id = list(reviews.keys())[0]   # 딕셔너리의 첫 번째 키
first_review = reviews[first_id]

print("리뷰가 가진 필드:", list(first_review.keys()))
print("추천 여부:", first_review["voted_up"])
print("플레이 시간:", round(first_review["author"]["playtime_forever"] / 60, 1), "시간")
print("리뷰 일부:", first_review["review"][:200])   # 앞 200자만

이렇게 찍어 보면 리뷰 하나가 recommendationid, author, language, review, voted_up, votes_up, timestamp_created 같은 여러 필드를 갖고 있다는 걸 알 수 있어요. 이 중 우리가 분석에 쓸 필드만 골라 다음 단계에서 표로 옮깁니다. (실제 필드 목록과 값은 게임·시점에 따라 달라질 수 있어요.)

⑤ 표(DataFrame)로 변환 — 딕셔너리는 분석이 불편하니 표로

import pandas as pd

rows = []
for r in reviews.values():
    rows.append({
        "review": r["review"],                                   # 리뷰 텍스트
        "recommended": r["voted_up"],                            # 추천 여부 True/False
        "playtime_hours": round(r["author"]["playtime_forever"] / 60, 1),  # 분→시간
        "timestamp_created": r["timestamp_created"],             # 작성 시각
    })

df = pd.DataFrame(rows)
print(df.shape)   # (행 수, 열 수)
df.head()         # 처음 5개 미리보기

⑥ 표를 한번 탐색해 보기 — 저장하기 전에 숫자로 한눈에 훑어 두면 좋아요. 4강에서 배운 탐색 방법을 그대로 씁니다.

print("총 리뷰 수:", len(df))
print("추천 비율:", round(df["recommended"].mean() * 100, 1), "%")   # True 비율 = 추천 비율
print("평균 플레이 시간:", round(df["playtime_hours"].mean(), 1), "시간")
print("최대 플레이 시간:", round(df["playtime_hours"].max(), 1), "시간")

mean()은 평균을 구하는 함수인데, 추천 여부는 True/False(1/0로 취급)라서 평균을 내면 그대로 추천 비율이 됩니다. 예를 들어 스타듀밸리처럼 호평이 많은 게임은 추천 비율이 90%대로 아주 높게 나오고, 평균 플레이 시간도 길게 잡혀요. (구체적인 숫자는 받은 리뷰에 따라 매번 달라집니다.)

⑦ CSV로 저장 — 한글이 깨지지 않게 utf-8-sig

df.to_csv("stardew_reviews.csv", index=False, encoding="utf-8-sig")
print("저장 완료 → stardew_reviews.csv")

왜 굳이 파일로 저장할까요? 두 가지 이유예요. 효율성 — 한 번 받아 두면 분석할 때마다 다시 수집하지 않아도 됩니다(수집은 느리니까요). 안정성 — Steam 서버 점검이나 인터넷 끊김에도, 이미 받아 둔 파일이 있으면 작업을 이어 갈 수 있어요.

⑧ 파일 다운로드(Colab) — Colab 서버에 만든 파일을 내 컴퓨터로 내려받습니다.

# Colab에서 실행하면 자동으로 다운로드 창이 뜹니다
from google.colab import files
files.download("stardew_reviews.csv")

⚠️ Colab은 세션이 끊기면(시간 경과·브라우저 닫음) 파일이 사라집니다. 만든 CSV는 꼭 위 코드로 다운로드해 두세요. 작업 중간중간 저장하는 습관이 실무에서도 중요해요. ⚠️ 글로벌 인기작이 아니면 한국어 리뷰가 적을 수 있어요 → 영어 리뷰 병행을 고려하세요.

3. 파이썬 기초 — 코드를 "읽기" 위한 최소한

완벽히 외울 필요는 없어요. 흐름을 읽고 검증할 수 있을 정도면 충분합니다.

직접 쳐 보며 감을 잡아 보세요 (한 셀로 실행).

# 리스트 — 순서가 있고, 0번부터 꺼낸다
games = ["스타듀밸리", "어몽어스", "사이버펑크"]
print(games[0])              # 스타듀밸리 (0번째)
games.append("발더스 게이트 3")  # 끝에 추가

# 딕셔너리 — 키로 값을 꺼낸다 (JSON과 같은 구조)
review = {"text": "재밌어요", "recommended": True}
print(review["text"])        # 재밌어요

# 반복문 — 리스트 항목을 하나씩 (들여쓴 줄이 for의 몸통)
for g in games:
    print(g)

# 내장 함수
print("리스트 개수:", len(games))

4. steamreviews 내부는 사실 4강 그대로예요

"라이브러리 안이 깜깜이라 막막하다"고 느끼시면, 내부 구조를 떠올려 보세요(다 알 필요는 없어요). 1. Steam 서버에 API URL로 "리뷰 주세요" 요청을 보내고 → 2. 서버가 JSON으로 응답하면 → 3. 그 JSON을 파이썬 딕셔너리로 변환하고 → 4. 더 받을 게 있으면 반복문(for/while)으로 페이지를 반복한 뒤 → 5. 전체 결과를 반환합니다. → 4강에서 배운 API 호출 + 6강의 딕셔너리·반복문이 그대로 들어 있는 거예요.

5. "백지에서" AI로 만들기 + 에러 대응

코드를 외우려 하지 말고, 무엇을 할지를 말로 풀어 보세요. - Colab AI에게 이렇게 부탁합니다 — "steamreviews로 게임 리뷰를 수집하고, 바로 pandas DataFrame으로 표시해줘." 그러면 코드가 생성·실행됩니다. - 에러가 나면(라이브러리 버전이 바뀌면 자주 생겨요) 이렇게 하세요. 1. 에러 메시지부터 읽으세요 — 보통 "몇 번째 줄"인지 알려줍니다. 2. 그 줄을 눈으로 확인하세요(오타·구조 문제). 3. 안 되면 메시지를 ChatGPT 같은 AI에 붙여넣어 수정을 요청하거나, Colab AI에 "수정해줘"라고 하세요. - 단, 고친 이유를 이해하고 넘어가야 진짜 내 실력이 됩니다(1강 4대 원칙 기억하시죠).

마지막으로 하나 당부할게요. 이른바 "바이브 코딩"(AI에 다 맡기는 식)은 편하지만 반쪽짜리가 되기 쉬워요. ① 무엇을 만들지 설계가 1순위이고 → ② 그다음 문법도 꾸준히 눈에 익혀야 더 복잡한 개발을 해낼 수 있습니다.

🔑 핵심 용어

용어 쉬운 설명
변수 값을 담는, 이름표 붙인 상자
문자열 따옴표로 감싼 텍스트 값
리스트 [ ] 순서 있는 값 묶음(인덱스 0부터)
딕셔너리 { } 키:값 쌍 묶음(JSON과 같은 구조)
for문 항목을 하나씩 반복 처리(들여쓰기로 몸통 표시)
query_count 라이브러리가 Steam에 보낸 요청 횟수(이 값으로 수집량 상한도 지정)
DataFrame pandas의 엑셀 같은 표
CSV / utf-8-sig 표 데이터 저장 형식 / 한글 안 깨지는 인코딩

🎮 게임 기획자 시점

이번 과제에서 가장 기획자다운 결정은 "어떤 게임을 분석할까"입니다. "그냥 유명해서"가 아니라 분석할 가치가 있는 게임(예: 출시 후 평가가 급변한 게임, 라이브 운영으로 반등한 게임)을 고르고 선정 이유를 적으면, 같은 코드라도 포트폴리오의 이야기가 훨씬 강해져요. 코드는 AI가 짜주지만, 무엇을 왜 분석하는가는 기획자만 정할 수 있습니다.

⚠️ 흔한 오해 / 짚고 갈 점

✅ 30초 정리

  1. 전체 흐름은 설치 → 게임 ID(URL의 /app/숫자/) → 수집(download_reviews_for_app_id) → 구조 확인(필드 보기) → DataFrame → 탐색 → CSV(utf-8-sig) → 다운로드 입니다.
  2. 코드를 읽는 데 필요한 기초는 변수·문자열·리스트·딕셔너리·for문. 특히 딕셔너리는 JSON과 같은 구조라 API 응답을 다룰 때 핵심이에요.
  3. 에러는 메시지부터 읽고, AI로 고치되 이유를 이해하세요. 설계가 1순위, 문법은 꾸준히.

▶️ 다음 강 연결

이제 직접 해볼 차례예요 → 과제: 내 게임 리뷰 수집하기(게임 선정 → 수집 → DataFrame → CSV를 혼자서). 다음 주차는 데이터 전처리(결측치·중복·정규화)로 이어집니다. → assignment/README.md를 참고하세요.

전체📚 강의 목록