카테고리 없음

AI를 사용한 데이터 수집, 분석, 시각화

retill28 2024. 9. 26. 21:28

 

 

 

chatGPT, perplexity, Claude 등 다양한 AI 서비스들이 등장하고 있고, 

지금까지 배웠던 분석과정들을 이 AI들을 사용하여 프롬프트를 작성하는 것만으로 진행해보았다. 

 

코드작성과 에러 정정에 사용했던 것은 Gemini와 chatGPT 이고, 

군집 결과를 레포트화하는데 사용한 것은 perplexity, chatGPT,

전체 파이썬 코드 리뷰와 블로그 포스팅하는 데 사용한 것은 perplexity와 napkin.ai 이다. 

 

 

 

먼저 프롬프트란, 

위에서 저술한 AI에게 명령할 내용, 진행과정, 결과 형식을 지정하는 등 명령어 그 자체 라고 할 수 있다. 

그러니까 chatGPT 등에 검색창마냥 있는 말풍선에 작성할 지시사항을 이야기한다. 

예컨대, "오늘 대한민국의 지역별 날씨는 어떻고, 날씨를 반영해 적절한 옷을 추천해줘." 라고 하는 이 문장을 프롬프트라고 할 수 있다. 

 

프롬프트는 디테일하지 않더라도 AI가 받아들일 수 있게 명확하게 쓸수록 사용자가 기대한 결과 또한 잘 나타나는데, 

"오늘 대한민국의 지역별 날씨는 어떻고, 날씨를 반영해 적절한 옷을 추천해줘." 라는 문장과 

"오늘 대한민국의 지역별 날씨는 어떠한지 알려주고, 그 기온과 날씨를 반영해 적절한 옷을 추천해 줘. 단, 코트는 입지 않을거야." 라는 문장의 결과는 다르게 나타난다. 

즉 프롬프트를 잘 쓸수록 AI가 내어주는 결과물의 퀄리티 차이가 있다. 

 


 

 

우선 전체적인 과정은 이러하다.

 

Python을 이용하여 Yes24 웹사이트에서 도서 데이터를 수집하고 분석한다.

BeautifulSoup과 pandas 라이브러리를 활용하여 데이터를 크롤링하고,

TF-IDF를 통해 주요 키워드를 분석하며, KMeans 군집화를 통해 데이터의 패턴을 발견한다.

 

 


 

 

1. 데이터 수집 - 웹 크롤링 

웹 크롤링을 통해 데이터를 수집했다. 단, 코드는 ai가 작성하도록 지시했고. 

 

AI에게 URL을 주고 해당 페이지의 정보들을 수집해달라고 하자. 

그렇게 만들어진 코드를 실행해보면 무조건 오류가 난다. 

즉 아래의 그림에 적혀있듯, AI에게 크롤링을 하는데 있어 추가적인 정보가 필요한것. 

즉, 네트워크 헤더, HTML의 형식, Request의 일부 등을 주어야 한다.

이 부분이 바로 " 단, 코트는 입지 않을거야."와 같은 조건의 추가, 지시사항의 구체화 과정이다. 

 

 

 

(1) 1페이지 크롤링

 

네트워크 헤더, HTML의 형식, Request의 일부 등의 정보를 주면서, "위 페이지에서 데이터를 수집하고 잘 수집되었는지 판다스 데이터 프레임으로 확인하는 코드 작성" 하고 프롬프트를 써보자. 그럼 아래와 같이 훨씬 개선된 코드가 나오게 된다. 

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 요청할 URL
url = "https://www.yes24.com/24/Category/Display/001001025007?PageNumber=2"

# 웹 페이지 가져오기
response = requests.get(url)
response.raise_for_status()  # 상태 코드 체크

# BeautifulSoup으로 HTML 파싱
soup = BeautifulSoup(response.text, 'html.parser')

# 데이터를 저장할 리스트
data = []

# 상품 정보가 들어 있는 div 요소 찾기
goods_list = soup.find_all('div', class_='goods_info')

# 각 상품 정보 파싱
for goods in goods_list:
    title_tag = goods.find('div', class_='goods_name').find('a')
    title = title_tag.text.strip() if title_tag else ''
    
    author_tag = goods.find('span', class_='goods_auth')
    author = author_tag.text.strip() if author_tag else ''
    
    publisher_tag = goods.find('span', class_='goods_pub')
    publisher = publisher_tag.text.strip() if publisher_tag else ''
    
    date_tag = goods.find('span', class_='goods_date')
    pub_date = date_tag.text.strip() if date_tag else ''
    
    price_tag = goods.find('div', class_='goods_price').find('em', class_='yes_b')
    price = price_tag.text.strip() if price_tag else ''
    
    review_count_tag = goods.find('span', class_='gd_reviewCount').find('em', class_='txC_blue')
    review_count = review_count_tag.text.strip() if review_count_tag else '0'
    
    rating_tag = goods.find('span', class_='gd_rating').find('em', class_='yes_b')
    rating = rating_tag.text.strip() if rating_tag else '0.0'
    
    # 각 상품의 데이터를 딕셔너리 형태로 저장
    data.append({
        'Title': title,
        'Author': author,
        'Publisher': publisher,
        'Publication Date': pub_date,
        'Price (KRW)': price,
        'Review Count': review_count,
        'Rating': rating
    })

# pandas DataFrame으로 변환
df = pd.DataFrame(data)

# 데이터프레임 출력
print(df)

 

이 코드는 전달한 URL의 1페이지 데이터만 크롤링하여 데이터 프레임으로 만들고, 그것을 출력하게 하는 코드이다. 자잘한 에러들을 끊임없이 수정하고, 도서설명 부분을 가져오지 않아서 그 부분도 추가하면서 코드를 늘려나간다. 

 

 

 

(2) 여러 페이지 수집

 

1페이지의 추출이 끝나면, 문제가 없음을 확인하고, "예외처리 과정을 추가하고 1~10페이지 데이터를 수집하라"고 지시한다. 또, "수집한 정보들을 DB로 저장하고, 불러오는데에도 문제가 없는지 확인" 하도록 두번째 프롬프트를 작성한다. 

즉 이 과정을 자세하게 도식화하면 아래와 같다.

 

 

(3) 데이터베이스 저장

만들어진 데이터 프레임을 데이터 베이스를 sqlite로 저장했다.

(2),(3) 과정을 한꺼번에 나타내면 아래와 같다.

# 데이터를 저장할 리스트
data = []

# 예외 처리를 위한 try-except 블록
for page_number in range(1, 101):  # 1~5페이지까지 데이터 수집
    url = f"https://www.yes24.com/24/Category/Display/001001025007?PageNumber={page_number}"
    try:
    # """"
    # ...
    # """""
   
   except requests.exceptions.RequestException as e:
        print(f"페이지 {page_number}에서 오류 발생: {e}")
    except AttributeError as e:
        print(f"페이지 {page_number}의 상품에서 속성 오류 발생: {e}")


# pandas DataFrame으로 변환
df = pd.DataFrame(data)

# SQLite 데이터베이스에 저장
conn = sqlite3.connect('yes24_books.db')
df.to_sql('books', conn, if_exists='replace', index=False)
conn.close()

# 데이터베이스에서 데이터 읽어오기
conn = sqlite3.connect('yes24_books.db')
df_from_db = pd.read_sql_query("SELECT * FROM books", conn)
conn.close()

# 데이터프레임 출력 (display 사용)
display(df_from_db)

 

 

 

 

 

2.  데이터 분석 - 텍스트 분석 

수집한 데이터의 제목(title)과 설명(description)의 내용을 가지고, 키워드를 분석하게 한다. 

즉 프롬프트는, "수집한 데이터의 제목과 설명으로 키워드 분석을 진행, 결과를 시각화할 코드 작성" 이 되겠다. 

 

결과로 받은 코드는 무조건 또 에러가 발생한다.

워드 클라우드까지 진행해보면 이상한 결과가 나오기 마련인데, 이런 부분들은 한국어 형태소 분석이 필요하므로, 관련 라이브러리인 koreanize-matplotlib를 사용하자. 

프롬프트를  "수집한 데이터의 제목과 설명으로 키워드 분석을 진행, 결과를 시각화할 코드 작성, 한글은  koreanize-matplotlib 을 사용할 것"이라고 개선하자. 

 

그러고 나면 또다른 문제가 발생한다. 

예를 들어 의미가 없는 조사나 용언, 어미 등은 아무래도 빈도수가 높을 수 밖에 없다. 

키워드 분석은 빈도를 반영하기 마련이므로, 결과가 또 엉뚱하게 나오게 된다. 그러면?

또 한번 프롬프트를 개선할 수 밖에. 

" 수집한 데이터의 제목과 설명으로 키워드 분석을 진행, 결과를 시각화할 코드 작성, 한글은  koreanize-matplotlib 을 사용할 것, 불용어는 제외한다."

 

# 필요한 라이브러리 임포트
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from collections import defaultdict
import matplotlib.pyplot as plt
import koreanize_matplotlib
from konlpy.tag import Okt

# 한국어 형태소 분석기
okt = Okt()

# Title과 Description 컬럼을 합쳐 새로운 컬럼 생성
df_from_db['Title_Description'] = df_from_db['Title'] + ' ' + df_from_db['Description']

# 텍스트 전처리: 명사 추출
def preprocess_text(text):
    return ' '.join(okt.nouns(text))

# 전처리된 텍스트로 새로운 컬럼 생성
df_from_db['Processed_Text'] = df_from_db['Title_Description'].apply(preprocess_text)

# TF-IDF 벡터화
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(df_from_db['Processed_Text'])

# 각 문서의 주요 키워드 추출
feature_names = vectorizer.get_feature_names_out()
keywords_dict = defaultdict(list)

for i in range(tfidf_matrix.shape[0]):
    tfidf_scores = dict(zip(feature_names, tfidf_matrix[i].toarray()[0]))
    sorted_tfidf_scores = sorted(tfidf_scores.items(), key=lambda x: x[1], reverse=True)
    top_keywords = [keyword for keyword, score in sorted_tfidf_scores[:10]]  # 상위 10개 키워드 추출
    keywords_dict[i] = top_keywords

# 키워드 빈도 계산
keyword_counts = defaultdict(int)
for keywords in keywords_dict.values():
    for keyword in keywords:
        keyword_counts[keyword] += 1

# 막대 그래프 시각화
sorted_keyword_counts = sorted(keyword_counts.items(), key=lambda x: x[1], reverse=True)
keywords, counts = zip(*sorted_keyword_counts[:20])  # 상위 20개 키워드 시각화

plt.figure(figsize=(12, 6))
plt.bar(keywords, counts)
plt.xlabel('키워드')
plt.ylabel('빈도')
plt.title('TF-IDF를 이용한 주요 키워드 분석 (전처리 적용)')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

 

 

 

 

3.  데이터 군집화

2번 과정에서 분석한 키워드들을 군집화를 해보자. 

군집화란, 쉽게 말해 관련있는 것들을 하나의 그룹으로 묶는 과정을 이야기한다.

본래라면 알고리즘과, 수학을 이해하고 그 모든 과정들을 코딩까지 해야겠지만 ai에게 지시하도록 하자. 

"결과를 군집4개로 군집화를 진행하고 각 군집별 주요 상위 키워드를 30개씩 출력하고 막대그래프로 시각화 할 것"

 

결과는 아래와 같다. 

군집 1  군집2 군집3 군집4
엔비디아 (9) - 성의 (9) - 유럽 (9) - 회사 (9) - 이전 (9) - 합리 (9) - 기본 (9) - 체제 (9) - 직장인 (9) - 관련 (9) - 고민 (9) - 교양 (9) - 맑스 (9) - 빈곤 (9) - 국내외 (9) 

가격탄력성 (79) - 투자 (75) - 화폐 (71) - 산업 (70) - 가계 (62) - 한국 (61) - 기술 (60) - 세계 (58) - 미래 (57) - 시장 (56) - 중국 (51) - 역사 (48) - 지능 (45) - 자본주의 (43) - 디지털 (43)  부자 (32) - 반도체 (32) - 분석 (32) - 지식 (32) - 가계부 (31) - 비트코인 (31) - 시대 (30) - 글로벌 (30) - 위기 (29) - 이해 (28) - 행동 (27) - 세기 (27) - 암호 (27) - 부동산 (26) - 상식 (26)  경제 (174) - 경제학 (145) - 가격 (110) - 가가 (109) - 가게 (105) - 가격결정 (101) - 금융 (91) - 가격기구 (90)

 

 

 

 

 

 

 

 

 

4.  인사이트  도출  및  정리 

3번까지 만들어진 내용을 다시한번  AI에게 전달하여 인사이트들을 만들어보자. 

프롬프트의 내용에는 필수적으로 각 군집별 키워드들을 포함해야하며, 

"위 군집화 결과를 군집별로 키워드 및 인사이트를 찾아서 보고서 식으로 작성" 할 것을 지시하자. 

 

 

먼저, perplexity을 사용한 결과는 다음과 같다.

예스24 경제도서 키워드 군집 분석 보고서

군집 1: 현대 사회경제 이슈와 비판적 시각

주요 키워드: 엔비디아, 유럽, 회사, 직장인, 맑스, 빈곤, 체제, 합리, 교양

인사이트:

  1. 기술 기업(엔비디아)과 노동 시장(직장인, 회사)에 대한 관심이 높습니다.
  2. 맑스와 빈곤 키워드는 현대 경제 체제에 대한 비판적 접근을 시사합니다.
  3. 교양과 합리 키워드는 경제 지식의 대중화 트렌드를 반영합니다.
  4. 유럽 언급은 글로벌 경제 동향에 대한 독자들의 관심을 나타냅니다.
  5. 이 군집은 경제 이슈를 사회적, 철학적 맥락에서 다루는 도서들의 존재를 시사합니다.

군집 2: 거시경제와 미래 전망

주요 키워드: 가격탄력성, 투자, 화폐, 산업, 기술, 한국, 세계, 미래, 중국, 자본주의, 디지털

인사이트:

  1. 경제 이론(가격탄력성)과 실용적 지식(투자, 산업)이 균형을 이루고 있습니다.
  2. 한국, 중국, 세계 키워드는 글로벌 경제에 대한 높은 관심도를 반영합니다.
  3. 기술, 디지털, 미래 키워드는 4차 산업혁명과 관련된 경제 도서의 인기를 시사합니다.
  4. 자본주의에 대한 언급은 현 경제 체제에 대한 분석과 성찰을 다루는 도서들의 존재를 나타냅니다.
  5. 이 군집은 거시경제적 관점과 미래 지향적 내용을 다루는 도서들이 주를 이루고 있음을 보여줍니다.

군집 3: 개인 재테크와 현대 경제 현상

주요 키워드: 부자, 반도체, 분석, 가계부, 비트코인, 글로벌, 위기, 부동산, 암호

인사이트:

  1. 개인 재무관리(부자, 가계부)와 투자(부동산, 비트코인)에 관한 도서가 인기를 끌고 있습니다.
  2. 반도체 산업에 대한 관심이 높아, 관련 경제 도서의 수요가 있음을 알 수 있습니다.
  3. 비트코인과 암호 키워드는 새로운 금융 기술에 대한 독자들의 관심을 반영합니다.
  4. 글로벌과 위기 키워드는 세계 경제의 불확실성을 다루는 도서들의 존재를 시사합니다.
  5. 이 군집은 실용적인 재테크 지식과 현대 경제 현상을 분석하는 도서들이 주를 이룸을 나타냅니다.

군집 4: 경제학 기본 개념과 가격 이론

주요 키워드: 경제, 경제학, 가격, 가격결정, 금융, 가격기구

인사이트:

  1. 경제학의 기본 개념과 이론에 대한 도서들이 많이 출판되고 있음을 알 수 있습니다.
  2. 가격 관련 키워드(가격, 가격결정, 가격기구)의 높은 빈도는 시장 경제의 핵심 메커니즘에 대한 관심을 반영합니다.
  3. 금융 키워드는 경제학과 금융 분야의 연계성을 다루는 도서들의 존재를 시사합니다.
  4. 이 군집은 경제학 입문서나 기본 개념을 설명하는 도서들이 많이 출판되고 있음을 나타냅니다.
  5. '가가'와 '가게' 키워드는 실생활과 밀접한 경제 현상을 다루는 도서들의 존재를 시사할 수 있습니다.

종합 결론

예스24의 경제도서 키워드 분석 결과, 현재 경제 도서 시장은 다음과 같은 특징을 보이고 있습니다:

  1. 기본적인 경제 이론부터 최신 기술 트렌드까지 폭넓은 주제를 다루고 있습니다.
  2. 개인 재테크와 투자에 대한 실용적인 지식을 제공하는 도서들이 인기를 끌고 있습니다.
  3. 글로벌 경제 동향과 미래 전망에 대한 관심이 높습니다.
  4. 현대 경제 체제에 대한 비판적 시각을 제시하는 도서들도 존재합니다.
  5. 디지털 경제와 새로운 금융 기술에 대한 관심이 증가하고 있습니다.

이러한 트렌드는 독자들이 경제에 대한 기본적인 이해부터 실용적인 지식, 그리고 미래 지향적인 통찰까지 다양한 측면의 경제 지식을 추구하고 있음을 보여줍니다

 

 

 


 

 

chatGPT를 사용하면 아래처럼 보여준다.

 

경제 도서 키워드 분석 보고서

1. 군집 1: 사회적 및 조직적 동향

주요 키워드:

  • 엔비디아 (9)
  • 성의 (9)
  • 유럽 (9)
  • 회사 (9)
  • 이전 (9)
  • 합리 (9)
  • 기본 (9)
  • 체제 (9)
  • 직장인 (9)
  • 관련 (9)
  • 고민 (9)
  • 교양 (9)
  • 맑스 (9)
  • 빈곤 (9)
  • 국내외 (9)

인사이트: 군집 1은 기업과 조직의 성과 및 조직적 구조에 대한 키워드가 집중되어 있습니다. 엔비디아와 같은 기술 회사와 관련된 키워드는 현대 경제에서 기술이 어떻게 조직의 기본 요소로 자리 잡고 있는지를 시사합니다. 빈곤과 관련된 키워드 또한 포함되어 있어, 경제적 불평등과 조직 내에서의 사회적 책임에 대한 관심이 반영된 것으로 보입니다.


2. 군집 2: 경제 이론과 기술

주요 키워드:

  • 가격탄력성 (79)
  • 투자 (75)
  • 화폐 (71)
  • 산업 (70)
  • 가계 (62)
  • 한국 (61)
  • 기술 (60)
  • 세계 (58)
  • 미래 (57)
  • 시장 (56)
  • 중국 (51)
  • 역사 (48)
  • 지능 (45)
  • 자본주의 (43)
  • 디지털 (43)

인사이트: 군집 2는 경제 이론, 투자 및 기술에 대한 키워드로 구성되어 있습니다. 가격탄력성과 화폐와 같은 용어는 경제의 기본 원리에 대한 심도 깊은 이해를 필요로 합니다. 특히 디지털과 자본주의의 결합은 현대 경제의 변화를 반영하며, 글로벌 시장에서 한국의 역할을 재조명할 수 있는 기회를 제공합니다.


3. 군집 3: 부와 자산 관리

주요 키워드:

  • 부자 (32)
  • 반도체 (32)
  • 분석 (32)
  • 지식 (32)
  • 가계부 (31)
  • 비트코인 (31)
  • 시대 (30)
  • 글로벌 (30)
  • 위기 (29)
  • 이해 (28)
  • 행동 (27)
  • 세기 (27)
  • 암호 (27)
  • 부동산 (26)
  • 상식 (26)

인사이트: 군집 3은 부와 자산 관리, 투자에 관련된 키워드가 주를 이루고 있습니다. 비트코인과 부동산 같은 키워드는 현대 자산 관리의 새로운 패러다임을 보여줍니다. 특히 반도체와 같은 기술적 요소가 경제에 미치는 영향을 분석하는 것은 앞으로의 투자 전략을 세우는 데 중요한 역할을 할 것입니다.


4. 군집 4: 경제 및 금융의 기초

주요 키워드:

  • 경제 (174)
  • 경제학 (145)
  • 가격 (110)
  • 가가 (109)
  • 가게 (105)
  • 가격결정 (101)
  • 금융 (91)
  • 가격기구 (90)

인사이트: 군집 4는 경제학 및 금융의 기본 요소에 관한 키워드가 포함되어 있습니다. 경제와 가격결정, 금융과 같은 키워드는 경제 시스템의 기초를 다지며, 경제학의 원리를 이해하는 데 필수적입니다. 이 군집은 경제학의 이론적 기반과 실제 적용을 연결짓는 데 도움이 될 것입니다.

 

 

 

 

 

 

 


 

 

 

 

이번 포스팅에서는 AI만을 이용해 데이터를 수집하고, 분석, 나아가 시각화까지 했다. 

또한 위 과정을 정리하고 기록으로 남기는데에도 AI를 이용했다. 

 

AI를 사용한 이 모든 과정 중 가장 중요한 부분은 프롬프트의 작성 이고, 

마지막 4번 과정에서 보았듯이, 같은 프롬프트를 사용한다 해도 사용하는 AI마다, 사용자마다 전부 결과가 다르게 나올 수 있다. 

구체적이고, 명확하게, 프롬프트를 작성해야한다는 것을 잊지 말것. 이것이 가장 중요한 부분이다.