'분류 전체보기'에 해당되는 글 50건

  1. ChatGPT로 네이버 최저가 검색 기능 개발하기 - 2편
  2. ChatGPT로 네이버 최저가 검색 기능 개발하기 - 1편
  3. ChatGPT로 로또 당첨 번호 분석, 예측하기
  4. Mac OS 날짜/시간 오류 해결방법
  5. 갤럭시북Go 디스플레이 환골탈태 후기 1
  6. 갤럭시북S(Qualcomm)에 윈도우11 on ARM 설치 및 간단 후기
  7. Westone W40, AKG N5005 장기간 사용기
  8. 안미니멀 캠핑 소개
  9. 구형 노트북 Windows 11 설치/사용기
  10. Westone W40, AKG N5005 간단 사용 후기

지난 편에서는, Colab 환경에서 네이버 최저가 검색 크롤링 기능을 구현하기 위해 ChatGPT에 일을 시켜보았습니다만, Selenium Library의 한계로 Colab에서는 더 이상 진행할 수가 없었습니다.

 

그래서 Local에서 다시 시도해보기로 합니다. MS Code와 Python 개발 환경을 설치했습니다.

제가 개발하던 시절과는 다르게 MS Code설치하면 그 안에서 Plugin 처럼 Python같은 것도 설치할 수 있네요. 참 좋은 세상입니다.

 

그럼 본격적으로 시작해봅니다.

코드는 지난 시간에 chatGPT가 다 만들어주었으니, 잠시 리뷰해보겠습니다.

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

def get_lowest_price_product_url_selenium(product_name):
    # Selenium WebDriver 설정
    service = ChromeService(executable_path=ChromeDriverManager().install())
    options = webdriver.ChromeOptions()
    options.add_argument('headless')  # 창 없는 모드
    options.add_argument('disable-gpu')
    options.add_argument('lang=ko_KR')  # 한국어 설정
    browser = webdriver.Chrome(service=service, options=options)

    # 네이버 쇼핑으로 이동하여 제품 검색
    browser.get("https://search.shopping.naver.com/search/all?query=" + product_name)
    time.sleep(2)  # 페이지 로드 대기

    # 최저가 제품의 URL 추출
    browser.get(product_url)
    time.sleep(2)  # 페이지 로드 대기
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.buyButton_btn_compare__4MFuE')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)

    # 브라우저 닫기
    browser.quit()

# 사용자로부터 제품 이름 입력받기
product_name = input("검색하고자 하는 제품 이름을 입력하세요: ")
get_lowest_price_product_url_selenium(product_name)

 

중간에 CSS_SELECTOR에 있는 buyButton~ 저 부분은 네이버 쇼핑 페이지에서 개발자 모드에 들어가서 내가 찾아 넣어야 하는데요, 실제 네이버쇼핑 페이지에는 없는 경우가 많았습니다. 네이버 페이지를 계속 보니, 쇼핑검색의 첫번째 페이지에는 최저가 표시가 없는 경우가 많고, 검색결과 중에 제품의 Catalog Page링크가 있는데, Catalog Page 내에 들어가야 최저가 표시가 있는 것을 발견했습니다.

 

그래서 고민을 하다가, 페이지 크롤링을 두번하는 것이 어떨까 아이디어를 내봤습니다.

"네이버 쇼핑 검색 1차 크롤링해서, Catalog Page 링크 확보한 후, Catalog Page를 다시 크롤링해서 최저가 링크 가져오기"로 바꿔보면 되지 않을까 싶었습니다. 주소만 다르지 크롤링 두번하는 되는 거라서, 적당히 Copy & Paste하면 될 것 같았습니다.

그래서 만든 코드는 아래와 같습니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

def get_lowest_price_product_url_selenium(product_name):
    # Selenium WebDriver 설정
    service = ChromeService(executable_path=ChromeDriverManager().install())
    options = webdriver.ChromeOptions()
    options.add_argument('headless')  # 창 없는 모드
    options.add_argument('disable-gpu')
    options.add_argument('lang=ko_KR')  # 한국어 설정
    browser = webdriver.Chrome(service=service, options=options)

    # 네이버 쇼핑으로 이동하여 제품 검색
    browser.get("https://search.shopping.naver.com/search/all?query=" + product_name)
    time.sleep(2)  # 페이지 로드 대기

    # 최저가 제품의 Catalog URL 추출
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.product_compare__Kfwlg')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 Catalog URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)

    # 최저가 제품의 URL 추출
    browser.get(product_url)
    time.sleep(2)  # 페이지 로드 대기
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.buyButton_btn_compare__4MFuE')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)

    # 브라우저 닫기
    browser.quit()

# 사용자로부터 제품 이름 입력받기
product_name = input("검색하고자 하는 제품 이름을 입력하세요: ")
get_lowest_price_product_url_selenium(product_name)

 

그리고 다음은 실행 결과입니다.

/usr/bin/python3 /Users/ACIDBURN/Documents/Coding/Naver_Lowest_Price_Selenium.py

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
MAC16:Coding ACIDBURN$ /usr/bin/python3 /Users/ACIDBURN/Documents/Coding/Naver_Lowest_Price_Selenium.py
/Users/ACIDBURN/Library/Python/3.9/lib/python/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020
  warnings.warn(
검색하고자 하는 제품 이름을 입력하세요: 아이폰15프로 256GB 자급제
최저가 제품 Catalog URL: https://cr.shopping.naver.com/adcr.nhn?x=yefTI6VgqhQo7hbdQD298P%2F%2F%2Fw%3D%3Ds94zOEoJabaiLD7SZR0EsslXTrx5XKScUbyi6ESGid8SxgRr7I3pQK3IFghCXYbC6uXAo7C1Oc4tYgQHkFClKNSER9vd%2BL3gFRE8Xbm9xpt3WBY513xwFKnjS6%2BHy18WTrGd3CAlg8SpSdqTFw1ApvgTFZUrvRKnZcZpfV%2Fwu0W8eKc2vHmyDiFz6z7BhkveXpOr9sPYwajBkeE07IGGkJ8q8LIarFFrbJieiK6Rnd3yu2VcoSXmmBH79cr0bdTSl5X7PE%2BGeGF2XkoIgpEqmFGOvThZsNgVF7LHDTCmIXPdv39ptNf4N%2FwyXuMrYz2Ge%2F%2FBwD9xlUCuWLWemaWVTYdnqPuDC%2Fgl5yvm4sVtB7009rv0gL1YdSn5VFNKsVbay%2FOIq6qLqW%2BXB7aAhUB%2FZQCVdN3LpKf%2FbKuiZi7z1XJT6Vec1qLczsKbVg9HYclWrDRsedrZkNL785%2B5AV95meEqNGnYP2mQGFwl2o9AJeRM8JJ1iC5VoMUmeTETRygVRJoTEwFp83LCDTlYUT5z%2FawtK%2FlJjOKzlJV2IEBfprxFITMQJi5RFUiavbTCYnnFjT%2BbHlEfoJP37ZGqMrXynLc99iO6CN%2FbvLpNEgAE0YWjqJm6JUcf3WgSuHK7uJ85TQcNk8l6pSNQzL8Q3TUPgCJTL3ruaVJreZl%2BplMuLoOq2k%2BBBQEGhvEplrOhVpAiGcBbP2SwDVOcazNQfbdXHf%2B9za7bfeOAMRN%2BcT%2F9p%2BChB0CIl3BeKsFF2drF%2B%2BsFv&nvMid=42617437619&catId=50001519
최저가 제품 URL: https://cr.shopping.naver.com/adcr.nhn?x=USdtAXPJcw7NBhvDh6ME7v%2F%2F%2Fw%3D%3DsPhUEUnCivpSozxzJCtn4X1H84T0bcB2R0S2ckbEPXGsh4%2F%2BsIkGOcsjpRoly8iy91TiI7XbWKfbFTC8O67dtkVonis1xFR8Vg6%2FQP7779BxI8O3awYw2F01MqNqmOmepwSX9OxZvO0rPDBtkS5K%2FLdfeOpmloVehA3ESOPqbtTB1CySR%2FjCqjMmlbvlHjt5utPvOVpkiiuS2NnSY3AoTBh5EmXnF4H3IfqnZhoShupk4UGs2AiZAiqDwe3MPDaE5JHpqHvcixzgF8AalnMSphuNFzzz2Q6anY3mdM6aZSF4idQjoDjQPNjm3oGJC%2BAOD8ykgfjkpR8NbWz%2Fne%2Fn1nkWBpLgXa1AIhVzuIkQNMNhYiOG4HmV%2BsD5IDpS72X2odzp%2FdtCYNDHM0%2FAcXVrE1MHPv45Edr5fvvv%2FlTzZa4UFV%2FqDmWmSKLRyViJp%2FFfHX8dTXGd3GERhHB170jUZEJqsf9m110U9b5C3MhBzGHuEoNG0uj12g0%2F4PFHZzcOhcvyfFoOHjWOyAcz%2FmncFtrF%2Fz%2BUcpupZ5231Vhvtsieu98WLnorGiotJYxgKVbEBBw0aGTBpnSY3kiDYL8LRFc%2FnrvD952C9PD5gmE9QubaLT4rEGvUzEYbTV2vYncuzMqBtxWUHiamfb%2FB9pPrLv5UiMfx95GtdKVb69obEtf2dy8w24xJ26f9nYK9vPYixpQPQshAEO8fy1yLrqRcksjd3RIiU2Urj9GehuFhWIB1yDc13mDfw2R50LLGPPL44W8s3hXn%2FnqWSCUvPdPScCuZlJ5%2F9plHkOFOU0mKPzahWkbDrUFJ2hBG8QaB8WVzn&nvMid=43044708913&catId=50001519
MAC16:Coding ACIDBURN$

 

결과는 성공적입니다. 아이폰이 아니라, 갤럭시를 검색해도 잘 나옵니다.

물론 네이버 같은 대형페이지는 구조가 계속 바뀌고 저런 CSS Selector도 고정값이 아니기 때문에, 이후에는 동작하지 않을 수 있습니다만, 가장 확실한 방법은 정식으로 네이버 API를 쓰면 되는데요, 그건 나중에 시도해보려고 합니다.

 

작은 개인 과제이지만, 이 프로젝트를 시작한 동기는 "Python을 1도 모르는 저같은 사람도, ChatGPT를 이용해서 이런 것들을 개발할 수 있다는 점을 확인하는 것"이었고, 대단히 성공적이라는 생각이 듭니다.

 

앞으로 이렇게해서 ChatGPT를 활용한 시도를 계속해보려고 합니다.

 

이상으로 chatGPT를 이용하여 네이버 최저가 검색 기능 개발기를 마칩니다.

 

 



저는 코딩 손 놓은지 이제 15년이 넘은 직장인입니다. 현재는 개발과 무관한 일을 하고 있구요.

마음 한구석에 코딩에 대한 작은 소망들이 있기는 했습니다만, 다시 시작한다는게 쉽지 않기도 하고, 요즘 언어들을 새로 배운다는 것도 낯설기도 하고 그랬습니다.

그런데 ChatGPT의 시대가 왔네요. 그래서 개발을 한번 시도해보기로 했습니다.

 

주제 : ChatGPT로 웹크롤링을 통한 네이버 최저가 검색 기능 개발

목적 : 1) GPT를 이용한 개발에 익숙해지기 2) 노코딩 개발 툴에 익숙해지기

일단 PC에 개발환경 셋업하는 것도 귀찮으니까, Google Colab을 활용하기로 합니다.

 

ChatGPT와의 대화 전체를 남기려니, 글만 길어지는 것 같아서, 제 프롬프트만 Full로 남기고 ChatGPT의 답변이나 결과는 핵심만 정리해서 공유하려고 합니다.

 

당신
내가 원하는 제품이름을 입력받아서, 네이버쇼핑 웹페이지에서 그 제품을 검색하고 그 검색 결과 페이지에서 최저가 제품을 판매하는 사이트 URL을 리턴하는 파이썬 코드를 만들어줘.
이 코드는 colab에서 돌아가게 해줘

ChatGPT
네이버 쇼핑 검색 결과를 스크래핑하여 최저가 제품의 판매 사이트 URL을 리턴하는 파이썬 코드를 만드는 것을 도와드리겠습니다. 구현을 위해 Python에서 사용할 수 있는 requestsBeautifulSoup 라이브러리를 사용할 예정입니다. 이 코드는 Google Colab 환경에서 작동하도록 설정됩니다. requests를 사용해 네이버 쇼핑 검색 결과 페이지의 HTML을 가져오고, BeautifulSoup으로 파싱하여 최저가 제품 정보를 추출합니다.

 

# 필요한 라이브러리 설치
!pip install requests beautifulsoup4

import requests
from bs4 import BeautifulSoup

def get_lowest_price_product_url(product_name):
    # 네이버 쇼핑 URL 구성
    base_url = 'https://search.shopping.naver.com/search/all'
    query_params = '?query=' + requests.utils.quote(product_name)
    full_url = base_url + query_params
    
    # 네이버 쇼핑 페이지로 요청을 보내고 HTML을 가져옴
    response = requests.get(full_url)
    if response.status_code == 200:
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')
        
        # 최저가 제품의 정보를 추출 (구현 단계는 예시로, 실제 HTML 구조에 따라 달라질 수 있음)
        product_list = soup.select('.basicList_item__2XT81')
        if not product_list:
            return "제품을 찾을 수 없습니다."

        lowest_price = float('inf')
        lowest_price_url = ''

        for product in product_list:
            price = product.select_one('.price_num__2WUXn')
            if price:
                price = float(price.get_text().replace(',', '').replace('원', ''))
                if price < lowest_price:
                    lowest_price = price
                    link = product.select_one('.basicList_link__1MaTN')
                    if link and link.has_attr('href'):
                        lowest_price_url = link['href']

        return lowest_price_url
    else:
        return "네이버 쇼핑 검색에 실패했습니다."

# 사용 예시
product_name = "삼성 갤럭시 S21"  # 검색하고자 하는 제품 이름
lowest_price_product_url = get_lowest_price_product_url(product_name)
print(lowest_price_product_url)

 

product_name을 하드코딩하게 되어있네요. 

 

당신
product name은 나한테 입력받도록 해줘

 

# 필요한 라이브러리 설치
!pip install requests beautifulsoup4

import requests
from bs4 import BeautifulSoup

def get_lowest_price_product_url(product_name):
    # 네이버 쇼핑 URL 구성
    base_url = 'https://search.shopping.naver.com/search/all'
    query_params = '?query=' + requests.utils.quote(product_name)
    full_url = base_url + query_params
    
    # 네이버 쇼핑 페이지로 요청을 보내고 HTML을 가져옴
    response = requests.get(full_url)
    if response.status_code == 200:
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')
        
        # 최저가 제품의 정보를 추출 (구현 단계는 예시로, 실제 HTML 구조에 따라 달라질 수 있음)
        product_list = soup.select('.basicList_item__2XT81')
        if not product_list:
            return "제품을 찾을 수 없습니다."

        lowest_price = float('inf')
        lowest_price_url = ''

        for product in product_list:
            price = product.select_one('.price_num__2WUXn')
            if price:
                price = float(price.get_text().replace(',', '').replace('원', ''))
                if price < lowest_price:
                    lowest_price = price
                    link = product.select_one('.basicList_link__1MaTN')
                    if link and link.has_attr('href'):
                        lowest_price_url = link['href']

        return lowest_price_url
    else:
        return "네이버 쇼핑 검색에 실패했습니다."

# 사용자로부터 제품 이름 입력받기
product_name = input("검색하고자 하는 제품 이름을 입력하세요: ")

# 함수 호출 및 결과 출력
lowest_price_product_url = get_lowest_price_product_url(product_name)
print(lowest_price_product_url)

 

코드가 완성된 듯 보입니다. 이 코드를 Google Colab에 붙여 넣고, Run시킵니다.

근데 "네이버 쇼핑 검색에 실패했습니다." 에러가 리턴되네요?

 

당신
 
네이버 쇼핑 검색에 실패했습니다. 이런 에러가 나왔는데, 어떻게 고치면 될까?
header를 추가했는데도, 동일한 에러가 나와. 어떻게 고치면 될까?

ChatGPT
블라블라~~~
  1. 헤더 정보 변경: 사용자 에이전트(User-Agent)와 같은 헤더 정보를 더욱 다양하게 변경해보세요. 때로는 차단을 피하기 위해 브라우저에서의 정상적인 요청처럼 보이게 만드는 것이 필요합니다.
  2. 세션 사용: requests에서 Session 객체를 사용하여 상태(쿠키, 세션 정보 등)를 유지하면서 연속된 요청을 보낼 수 있습니다. 이는 서버에게 더 인간적인 사용 패턴처럼 보일 수 있습니다.
  3. API 사용 검토: 네이버 쇼핑과 같은 서비스는 공식 API를 제공할 수 있습니다. 공식 API를 사용하면 데이터 접근이 더 쉽고, 서비스 제공업체의 정책을 준수하는 방식으로 데이터를 가져올 수 있습니다.
  4. 웹 브라우저 자동화 도구 사용: selenium과 같은 웹 브라우저 자동화 도구를 사용하여 실제 브라우저 세션을 통해 페이지에 접근하고, 데이터를 추출할 수 있습니다. 이 방법은 대부분의 웹사이트에서 효과적이지만, 더 많은 리소스를 사용하고 속도가 느릴 수 있습니다.

    블라블라~~~

 

위에 ChatGPT가 제안하는 1, 2번을 시도했고 다 실패했습니다. 3번은 이 프로젝트의 목적에 맞지 않으므로 기각했고요, 4번은 무슨 말인지 잘 모르겠습니다. 왜 실패인지 나중에 알게되었지만, 이때까진 그냥 코드의 문제라고만 생각했었죠.

 

당신
header, session을 추가했는데도, 동일한 에러가 나는데 어떻게 고치면 될까?
 
 
ChatGPT
만약 requests와 BeautifulSoup을 사용하면서 헤더와 세션을 추가했음에도 불구하고 여전히 "네이버 쇼핑 검색에 실패했습니다."와 같은 오류가 발생한다면, 네이버 쇼핑 사이트의 방어 메커니즘이 강화되었거나, 스크래핑을 방지하기 위한 추가적인 조치가 적용되었을 가능성이 높습니다. 이 경우, 다음과 같은 몇 가지 대안적인 접근 방법을 고려해볼 수 있습니다.

1. 공식 API 사용

가장 권장되는 방법은 네이버 쇼핑이 제공하는 공식 API를 사용하는 것입니다. 공식 API를 사용하면, 웹 스크래핑을 통한 데이터 추출에서 발생할 수 있는 여러 문제를 피할 수 있으며, 네이버의 정책에도 부합합니다. 네이버 개발자 센터에서 API 사용 신청과 관련된 정보를 찾아볼 수 있습니다.

2. 웹 브라우저 자동화 도구 사용

selenium과 같은 웹 브라우저 자동화 도구를 사용하는 것입니다. selenium은 실제 웹 브라우저를 자동으로 조작하여 사이트에 접근하고, 사용자와 유사한 방식으로 웹 사이트를 탐색하므로, 많은 웹 사이트의 스크래핑 방지 메커니즘을 우회할 수 있습니다. 단, 이 방법은 성능이 느릴 수 있고, 추가적인 리소스가 필요합니다.

Selenium 예제 코드

아래 코드는 selenium을 사용하여 네이버 쇼핑에서 제품을 검색하고 최저가 제품의 URL을 가져오는 예제입니다. 이 코드를 실행하기 전에, selenium과 webdriver-manager를 설치하고, 적절한 웹드라이버(Chrome, Firefox 등)가 필요합니다.

 

!pip install selenium
!pip install webdriver-manager

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time

def get_lowest_price_product_url_selenium(product_name):
    # Selenium WebDriver 설정
    service = ChromeService(executable_path=ChromeDriverManager().install())
    options = webdriver.ChromeOptions()
    options.add_argument('headless')  # 창 없는 모드
    options.add_argument('disable-gpu')  
    options.add_argument('lang=ko_KR')  # 한국어 설정
    browser = webdriver.Chrome(service=service, options=options)
    
    # 네이버 쇼핑으로 이동하여 제품 검색
    browser.get("https://search.shopping.naver.com/search/all?query=" + product_name)
    time.sleep(2)  # 페이지 로드 대기
    
    # 최저가 제품의 URL 추출
    try:
        # 최저가 제품 링크 찾기 (네이버 쇼핑 페이지의 구조에 따라 수정이 필요할 수 있음)
        lowest_price_product = browser.find_element(By.CSS_SELECTOR, '.basicList_link__1MaTN')
        product_url = lowest_price_product.get_attribute('href')
        print("최저가 제품 URL:", product_url)
    except Exception as e:
        print("데이터 추출 중 오류 발생:", e)
    
    # 브라우저 닫기
    browser.quit()

# 사용 예시
product_name = "삼성 갤럭시 S21"  # 검색하고자 하는 제품 이름
get_lowest_price_product_url_selenium(product_name)

 

아 뭔가 라이브러리가 바뀌었습니다.  Request/BeautifulSoup 대신에, Selenium을 쓰라고 하네요.

Colab에 붙여넣고 Run해봅니다. 에러가 나네요.

 

당신
AttributeError: 'NoneType' object has no attribute 'split' 이런 에러가 나는데 어떻게 고치지?

ChatGPT
블라블라블라~~~~

당신
아니 그게 아닌 것 같아.

/usr/local/lib/python3.10/dist-packages/webdriver_manager/drivers/chrome.py in get_latest_release_version(self)
62 return determined_browser_version
63 # Remove the build version (the last segment) from determined_browser_version for version < 113
---> 64 determined_browser_version = ".".join(determined_browser_version.split(".")[:3])
65 latest_release_url = (
66 self._latest_release_url

AttributeError: 'NoneType' object has no attribute 'split'

이런 에러인데 다시 한번 봐줘

ChatGPT
블라블라블라~~~

1. webdriver_manager와 Chrome의 호환성 확인

webdriver_manager와 설치된 Chrome 브라우저 버전이 호환되는지 확인합니다. 때때로 webdriver_manager가 로컬 시스템에 설치된 Chrome의 버전을 정확히 식별하지 못할 수 있습니다. 이를 해결하기 위해 Chrome 브라우저를 최신 버전으로 업데이트하거나, webdriver_manager를 최신 버전으로 업데이트해 볼 수 있습니다.

2. Chrome 버전 수동 지정

ChromeDriverManager를 사용할 때, Chrome의 특정 버전에 대한 드라이버를 명시적으로 요청할 수 있습니다. 이 방법은 webdriver_manager가 자동으로 Chrome 버전을 결정하는 데 문제가 있을 때 유용할 수 있습니다.

3. 로컬 ChromeDriver 사용

webdriver_manager 대신 시스템에 직접 설치된 chromedriver를 사용하는 것도 한 가지 방법입니다. 이 경우, chromedriver의 경로를 직접 지정해야 합니다.

블라블라블라~~~

 

 

ChatGPT의 답변들을 보자니, 첨엔 잘 모르겠었는데 이제 조금 이해가 갑니다.

Selenium은 실제로 크롬웹브라우저를 구동시켜서 웹페이지를 로딩한 후에 크롤링을 하는 거였습니다. 그러니 Cloud에서 돌아가는 Google Colab으로는 정상동작을 할 수 없는 거네요.

 

개발하시는 분들에겐 상식일텐데, 저같은 일반인은 먼 길 돌아서 알아내게 되었습니다. ㅠ.ㅠ

그래서 Colab으로 웹크롤링해서 네이버 최저가를 가져오는 것은 실패입니다.

로컬에 환경 셋팅하고 다시 시도해보려고 합니다. 이 내용은 2편에서 이어집니다.



나에게는 오래전부터 간직해 온 의문이 하나 있었다.

로또 당첨 번호 데이터를 오랫동안의 기간으로 분석을 하면 무엇인가 상관 또는 인과 혹은 다른 무언가라도 관계를 밝힐 수 있는 무언가가 있지 않을까 하는 것이었다.

물론 대학교과정까지 정상적으로 이수했다면, 로또 당첨 번호는 완벽하게 랜덤이라는 점은 따로 증명하지 않아도 사실로 이해할 수 있다.

그러므로 나 역시 그 점을 머리로 알고 있다.

매 회차가 완벽한 랜덤이고, 독립시행이므로, 앞회차가 다음 회차의 추첨에 영향을 주지도 않는다.

 

하지만 누구나 그런게 하나 쯤은 있지 않던가? 머리로는 알지만, 그것을 직접 데이터로 확인하고자 하는 마음, 그리고 데이터를 분석하다보면 혹시 누군가가 발견하지 못한 무엇인가를 발견할 수 있지 않을까 하는 마음.

 

나에게는 로또가 그런 아이템이었다. 하지만 그 데이터를 가지고, 다양한 통계기법을 적용해 보면서 분석/확인하기에는 나는 이론도, 스킬도 부족했고, 그런 부족한 부분들까지 공부하면서 채워가기에는, 다른 더 우선순위 높은 일들에 밀려 버렸고, 그렇게 차일피일 10년이 지나갔다.

 

그러다 ChatGPT의 세상이 왔다. 말만하면 다 해준다고 하니, 이렇게 기쁠 수가!

아주 적은 노력으로 지난 10년간 가져온 의문과 소망을 해결할 수 있는 시대가 되었는데, 이 정도면 시도해봐야만 한다.

그래서 시도해봤다.

 

시도한 과정을 단계별로 보면 아래와 같다

1단계 : 당첨 번호 DB 제작

2단계 : GPT에서 이 DB를 기본 Knowledge로 갖는 GPTs 빌드

3단계 : 빌드된 GPTs와 함께 로또 당첨 번호 물고 뜯고 맛보기

 

1단계 : 당첨 번호 DB 제작

 

먼저, 지난 약 1100회의 로또 추첨 역사를 Excel 데이터로 만들었다. 로또 공홈에 가면, 과거 추첨 DB를 Excel 파일로 제공해 준다. 물론 그 파일을 그대로 쓰기에는 형식과 구성이 탐탁치 않기에, ChatGPT가 이해하기 쉽도록 살짝 가공해서, 아래와 같은 형식으로 만들었다.

 

작성한 Excel 파일의 캡쳐

사실, 데이터 처리를 위해서는 셀병합도 좀 없애고, 나열하기 좋게 변경할 필요가 있다고 생각되었지만, 이 정도만 해도, GPT가 잘 알아서 해주지 않을까 하는 생각에 일단 여기까지만 했다. 원하는데로 동작하지 않으면 나중에 좀 더 만져보면 되지 않을까 하는 생각도 있었다.

 

2단계 : 당첨 번호 DB를 Knowledge로 갖는 GPTs 생성하기

 

일단 GPTs Builder로 간다. 적당히 내가 궁금한 것들을 몇자 적어 Instruction에 넣고, 제작한 DB 파일을 업로드해주었다. 이름은 "로또봇"이라고 지어주었다. 지금와서 생각해보니 "LLM645 (Large Lottery Model 645)"이라고 지을걸 그랬다. 딸둘 아빠에게 로"또봇"은 호감가는 이름이 아니다.

 

3단계 : 로또봇과 함께 로또 당첨 데이터 물고 뜯고 맛보기

 

일단, 기본 셋팅은 끝났다. "일해라 휴먼.. 아니 GPT!"

 

일단 만들었으면, 당연히 이번 주 당첨 예상 번호부터 뽑아봐야지.

당신
이번주 로또번호 알려줘
 
 
로또봇
 
로또 당첨 번호 데이터를 확인했어요. 데이터에는 회차별로 연도, 추첨일, 당첨 번호(1부터 6까지), 그리고 보너스 번호가 포함되어 있네요. 이제 이 데이터를 기반으로 회귀분석을 진행해서 이번 주 로또 번호를 예측해보겠습니다.
데이터 처리 과정에서 예측 모델을 생성하기 위해선 다음 단계를 거칠 예정이에요:
  1. 데이터 전처리: 필요한 컬럼을 정리하고, 데이터 타입을 적절히 조정합니다.
  2. 회귀분석 모델 생성: 과거 당첨 번호를 기반으로 회귀 모델을 만들어 봅니다.
  3. 번호 예측: 생성된 모델을 사용하여 이번 주 예상 당첨 번호를 예측합니다.
진행하기 전에, 데이터를 정확하게 처리하기 위해 컬럼 이름을 재설정하고 필요한 부분만 추출할게요. [1] ​
 
데이터를 정리했습니다. 첫 번째 행(이제는 제거된)에 'NaN'과 '보너스'라는 값이 포함되어 있었는데, 이는 필요없는 데이터였기 때문에 제거하고 컬럼 이름을 재설정했어요. 이제 '회차', '추첨일', '번호1'부터 '번호6'까지의 당첨 번호, 그리고 '보너스' 번호를 포함한 정제된 데이터를 가지고 있습니다.
하지만, 로또 번호 예측에 회귀분석을 직접 적용하기는 적절하지 않을 수 있습니다. 로또 번호는 무작위로 추출되며, 각 번호가 나올 확률은 독립적이고 균등합니다. 이는 과거 데이터로부터 미래의 로또 번호를 예측하는 통계적 모델링에는 적합하지 않다는 것을 의미해요. 그러나 여기서는 데이터를 활용해 재미 삼아 간단한 예측을 시도해볼 수는 있지만, 이는 실제 로또 번호를 예측할 수 있는 신뢰할 수 있는 방법이 아니라는 점을 이해해 주세요.
대신, 과거 데이터로부터 빈도수를 기반으로 무작위 번호를 생성하는 방식을 사용해볼까 합니다. 이 방식은 과거 당첨 번호의 출현 빈도를 분석하여, 가장 자주 나왔던 번호를 기반으로 이번 주 로또 번호를 예측하는 방법이에요. 이렇게 하면 데이터 분석의 재미를 유지하면서도 어느 정도 현실적인 접근을 할 수 있습니다.
이 방법으로 번호를 생성하기 전에, 각 번호가 몇 번 나왔는지 빈도수를 살펴보겠습니다. [2]​
 
각 번호가 과거에 얼마나 자주 나왔는지 빈도수를 확인했습니다. 예를 들어, '1' 번은 155회, '34' 번은 가장 많은 168회 출현했습니다. 반면, '9' 번은 가장 적은 116회 출현했어요.
이 빈도수를 기반으로 각 번호의 출현 확률을 계산하고, 이 확률에 따라 번호를 무작위로 선택하여 5세트의 로또 번호를 생성할 것입니다. 이 방식은 과거 데이터를 기반으로 하지만, 로또 번호의 무작위성을 유지하는 데 도움을 줄 거예요.
각 번호가 선택될 확률을 계산하고, 이 확률에 따라 5세트의 번호를 생성해보겠습니다. [3]
 
이번 주 로또 번호 예측 결과, 5세트의 번호를 생성했어요. 여기 있습니다:
  1. 21, 28, 33, 36, 37, 40
  2. 13, 24, 27, 31, 33, 34
  3. 6, 7, 22, 36, 39, 43
  4. 10, 17, 26, 31, 38, 43
  5. 2, 3, 7, 17, 22, 37
이 번호들은 과거 데이터에 기반한 확률을 사용해서 무작위로 선택된 번호들이에요. 로또 번호의 무작위성을 완전히 반영할 수는 없지만, 과거 출현 빈도를 고려한 재미있는 시도예요. 로또를 즐길 때는 항상 책임감을 가지고 참여해 주세요. 행운을 빕니다! ​[4]

 

위와 같은 과정으로 로또봇은 당첨 번호를 예측해주었다. 일단 기대 이상으로 잘해준다. 가장 많이 당첨에 출현한 번호와 가작 적게 출현한 번호를 확인하였으며, 이에 따라 각 번호의 확률에 기반하여, 당첨 예상 번호를 추출해주었다. 놀랍다!

각 과정에서 정상적으로 수행했는지 코드를 확인해보았다.

# [1]코드

import pandas as pd

# Load the Lotto winning numbers data
df = pd.read_excel('/mnt/data/로또당첨번호.xlsx')

df.head()
결과
  회차별 로또 당첨번호 Unnamed: 1           Unnamed: 2 Unnamed: 3  Unnamed: 4  \
0          연도         회차                  추첨일      당첨 번호         NaN   
1         NaN        NaN                  NaN          1         2.0   
2        2024       1108  2024-02-24 00:00:00          7        19.0   
3         NaN       1107  2024-02-17 00:00:00          6        14.0   
4         NaN       1106  2024-02-10 00:00:00          1         3.0   

   Unnamed: 5  Unnamed: 6  Unnamed: 7  Unnamed: 8 Unnamed: 9  
0         NaN         NaN         NaN         NaN        NaN  
1         3.0         4.0         5.0         6.0        보너스  
2        26.0        37.0        39.0        44.0         27  
3        30.0        31.0        40.0        41.0         29  
4         4.0        29.0        42.0        45.0

역시 Excel Data를 좀 더 만질 걸 그랬다. 추출을 못한 건 아니지만, NaN이 많은 것을 보니 거슬린다.

 

# [2]코드
# 데이터의 첫 번째 행을 컬럼 이름으로 설정하고, 필요없는 행과 컬럼을 제거
df.columns = df.iloc[0] # 첫 번째 행을 컬럼 이름으로 설정
df = df.drop(0) # 첫 번째 행(이제 컬럼 이름이 되었음) 제거
df = df.reset_index(drop=True) # 인덱스 리셋

# 컬럼 이름 재설정
df.columns = ['연도', '회차', '추첨일', '번호1', '번호2', '번호3', '번호4', '번호5', '번호6', '보너스']

# 필요한 컬럼만 남기고 '연도' 컬럼 삭제 (이번 분석에는 필요 없음)
df = df.drop('연도', axis=1)

# 데이터 확인
df.head()
결과
     회차                  추첨일 번호1   번호2   번호3   번호4   번호5   번호6  보너스
0   NaN                  NaN   1   2.0   3.0   4.0   5.0   6.0  보너스
1  1108  2024-02-24 00:00:00   7  19.0  26.0  37.0  39.0  44.0   27
2  1107  2024-02-17 00:00:00   6  14.0  30.0  31.0  40.0  41.0   29
3  1106  2024-02-10 00:00:00   1   3.0   4.0  29.0  42.0  45.0   36
4  1105  2024-02-03 00:00:00   6  16.0  34.0  37.0  39.0  40.0   11

헐, 우리 로또봇이 찰떡같이 알아서 Data를 잘 가공했다. 훌륭하다!

 

# [3]코드
# 당첨 번호들의 빈도수 계산
# 모든 번호 컬럼을 하나의 Series로 합치고, 각 번호의 출현 빈도를 계산
all_numbers = pd.concat([df['번호1'], df['번호2'], df['번호3'], df['번호4'], df['번호5'], df['번호6']]).astype(float)
frequency = all_numbers.value_counts().sort_index()

# 빈도수 출력
frequency
결과
1.0     155
2.0     143
3.0     150
4.0     149
5.0     141
6.0     147
7.0     150
8.0     141
9.0     116
10.0    147
11.0    149
12.0    161
13.0    156
14.0    160
15.0    146
16.0    146
17.0    156
18.0    165
19.0    148
20.0    153
21.0    150
22.0    133
23.0    135
24.0    148
25.0    137
26.0    150
27.0    158
28.0    135
29.0    140
30.0    138
31.0    149
32.0    129
33.0    154
34.0    168
35.0    146
36.0    148
37.0    154
38.0    149
39.0    153
40.0    158
41.0    136
42.0    143
43.0    156
44.0    148
45.0    160
dtype: int64

각 번호별 당첨 횟수까지 잘 뽑아내었다. 정말 훌륭한데?

 

# [4]코드
import numpy as np

# 번호의 출현 확률 계산
probabilities = frequency / frequency.sum()

# 5세트의 로또 번호 생성
predicted_sets = []
for _ in range(5):
    predicted_set = np.random.choice(probabilities.index, size=6, replace=False, p=probabilities.values)
    predicted_sets.append(np.sort(predicted_set))

predicted_sets
결과
[array([21., 28., 33., 36., 37., 40.]),
 array([13., 24., 27., 31., 33., 34.]),
 array([ 6.,  7., 22., 36., 39., 43.]),
 array([10., 17., 26., 31., 38., 43.]),
 array([ 2.,  3.,  7., 17., 22., 37.])]

대박! 각 숫자의 확률을 Seed로 넣어서 Random Number를 5세트 뽑아주었다. 로또봇! 너 일 잘하는 구나! 

 

근데, 내가 이런 예상 당첨 번호 뽑아보자고, 이걸 한게 아니잖아? 지금부터 슛들어갑니다.

당신
추첨 날짜와 추첨 번호 간에 상관관계가 있는지 분석해보고 결과를 그래프로 보여줘
 
지금 번역하기
 
로또봇
추첨 날짜와 추첨 번호 간의 상관관계를 분석하기 위해선, 날짜를 숫자형 데이터로 변환해야 합니다. 이 과정에서 '추첨일' 컬럼을 datetime 형태로 변환한 후, 이를 기준으로 각 날짜를 연속적인 숫자로 표현할 것입니다. 이렇게 하면 날짜와 각 번호 간의 상관관계를 계산할 수 있습니다.
분석을 위해 다음 단계를 진행할게요:
  1. '추첨일' 컬럼을 datetime 형식으로 변환합니다.
  2. 각 날짜를 연속적인 숫자(예: 연도와 일자를 조합한 숫자)로 표현합니다.
  3. 각 번호(번호1~번호6)와 변환된 날짜 간의 상관관계를 계산합니다.
  4. 계산된 상관관계를 바탕으로 그래프를 생성하여 결과를 시각화합니다.
먼저, '추첨일' 컬럼을 datetime 형식으로 변환하고, 각 날짜를 연속적인 숫자로 표현해 보겠습니다.
 
코드 해석 중 오류 발생
분석 과정에서 예상치 못한 내부 오류가 발생했습니다. 다만, 이 과정의 목적과 방법론에 대해서는 설명할 수 있어요.
일반적으로, 추첨 날짜와 추첨 번호 간의 상관관계를 분석하는 것은 로또 번호가 순전히 무작위로 선택되기 때문에 통계적으로 의미 있는 상관관계를 찾기 어렵습니다. 로또 번호 선택 과정은 과거의 날짜나 다른 외부 요인에 영향을 받지 않고 설계되어 있기 때문입니다.
상관관계 분석은 두 변수 간의 선형적 관계의 강도와 방향을 측정합니다. 상관계수는 -1에서 1 사이의 값을 가지며, 0에 가까울수록 두 변수 간에 선형적 관계가 없음을, 1 혹은 -1에 가까울수록 강한 선형적 관계가 있음을 의미합니다. 그러나, 이러한 분석은 변수 간에 인과관계를 나타내지 않습니다.
오류로 인해 직접적인 상관관계 계산 및 그래프 시각화를 제공할 수 없지만, 로또 번호와 같은 무작위 데이터의 경우 일반적으로 추첨 날짜와 같은 시간 변수와의 상관관계는 매우 낮거나 전혀 없을 것으로 예상됩니다. 이는 로또 번호 추첨 과정이 완전히 무작위이기 때문에, 어떤 시간적 요소와도 독립적이어야 하기 때문입니다. ​​
 
지금 번역하기
 
 
당신
이거 중요한 거니까 다시 한번 해봐. 팁 2만달러줄께
 
지금 번역하기
 
로또봇
 
코드 해석 중 오류 발생
 
분석을 다시 진행한 결과, 추첨 날짜와 각 번호 간의 상관관계는 다음과 같습니다:
  • 번호1과의 상관관계: 0.0311
  • 번호2와의 상관관계: 0.0227
  • 번호3과의 상관관계: 0.0028
  • 번호4와의 상관관계: 0.0091
  • 번호5와의 상관관계: 0.0266
  • 번호6과의 상관관계: 0.0404
상관관계 값이 -1에서 1 사이에 위치하는데, 여기서 모든 값이 0에 가까우므로 추첨 날짜와 로또 번호 간에는 거의 또는 전혀 상관관계가 없음을 알 수 있습니다. 이는 로또 번호 추첨이 무작위 과정임을 반영하며, 시간의 흐름에 따라 추첨 번호가 변화하는 경향이 없음을 나타냅니다.
이제 이 결과를 그래프로 시각화해 보겠습니다. 각 번호와 날짜_숫자 간의 상관관계를 바 차트로 표현해보겠습니다. ​
6개의 당첨번호와 추첨날짜간의 상관계수 (편차가 제법 있어보이지만, 모두 한없이 0에 가까운 값이므로, 상관없다는 이야기를 있어보이게 그래프로 만들어주었다. 한글이 깨져 아쉽지만 폰트문제이고, 어렵지 않은 그래프라 그냥 둔다)


상관관계 분석 결과를 바탕으로 한 그래프를 생성했습니다. 이 그래프는 추첨 날짜와 로또 번호 간의 상관관계 값을 시각적으로 보여줍니다. 상관관계 값이 모두 0에 가까운 것을 볼 수 있는데, 이는 추첨 날짜와 로또 번호 사이에 통계적으로 유의미한 선형 관계가 없음을 나타냅니다. 각 번호의 상관관계 값이 매우 낮아, 시간이 지남에 따라 번호의 추첨 패턴이 변한다고 볼 수 있는 증거가 없음을 시사합니다.
이 분석은 로또 번호가 무작위로 선택되며, 과거의 어떤 패턴이나 시간적 요소에 의해 영향을 받지 않는다는 로또의 기본 원칙을 반영합니다. 따라서, 로또 번호 선택 시 과거 데이터를 분석하는 것보다는 운이나 개인적인 선호에 의존하는 것이 더 적합할 수 있습니다. ​

 

오, 그렇구만. 추첨날짜는 관계가 없다고 한다. 제대로 한게 맞는지 코드도 보자. (역시 사람이나 인공지능이나 팁을 주면 일을 더 잘한다. ㅡ.ㅡ;;)

# 필요한 라이브러리 재로딩
import pandas as pd
import numpy as np

# 데이터 파일 다시 로드
df = pd.read_excel('/mnt/data/로또당첨번호.xlsx')

# 데이터 전처리
df.columns = df.iloc[0] # 첫 번째 행을 컬럼 이름으로 설정
df = df.drop(0).reset_index(drop=True) # 첫 번째 행 제거 및 인덱스 리셋
df.columns = ['연도', '회차', '추첨일', '번호1', '번호2', '번호3', '번호4', '번호5', '번호6', '보너스']
df = df.drop('연도', axis=1) # '연도' 컬럼 삭제
df['추첨일'] = pd.to_datetime(df['추첨일'], errors='coerce') # '추첨일'을 datetime 형식으로 변환
df['날짜_숫자'] = df['추첨일'].dt.year * 10000 + df['추첨일'].dt.month * 100 + df['추첨일'].dt.day # 날짜를 연속적인 숫자로 변환
df[['번호1', '번호2', '번호3', '번호4', '번호5', '번호6']] = df[['번호1', '번호2', '번호3', '번호4', '번호5', '번호6']].astype(float) # 번호 컬럼들을 숫자형으로 변환

# '날짜_숫자'와 번호들 간의 상관관계 계산
correlation = df[['날짜_숫자', '번호1', '번호2', '번호3', '번호4', '번호5', '번호6']].corr()

# '날짜_숫자'와 각 번호 간의 상관관계 출력
correlation['날짜_숫자']
결과
날짜_숫자    1.000000
번호1      0.031145
번호2      0.022726
번호3      0.002780
번호4      0.009056
번호5      0.026598
번호6      0.040431
Name: 날짜_숫자, dtype: float64

 

정말 일 제대로 한 것 맞다. 인정!

 

자 다른 것도 해보자. 추첨 연도와 당첨 번호간의 상관계수는 어떨까?

당신
추첨 연도와 당첨 번호의 빈도 간에 상관관계가 있는지 분석해줘
 
지금 번역하기
 
로또봇
추첨 연도와 당첨 번호의 빈도 간 상관관계를 분석하기 위해, 우선 각 연도별로 당첨 번호가 몇 번 출현했는지를 파악해야 합니다. 이후 각 연도별로 당첨 번호의 출현 빈도를 계산하고, 이를 연도와 비교하여 상관관계를 분석할 수 있습니다.
  1. 각 연도별로 당첨 번호(번호1~번호6)의 출현 빈도를 계산합니다.
  2. 연도별 출현 빈도의 합계를 구합니다.
  3. 연도와 출현 빈도의 합계 간 상관관계를 계산합니다.
먼저, 각 연도별로 당첨 번호의 출현 빈도를 계산해보겠습니다.
 
코드 해석 중 오류 발생
분석 과정에서 접근 방식에 오류가 있었습니다. corrwith 메소드는 DataFrame에 대해 사용되어야 하는데, 여기서는 Series 객체에 잘못 적용되었습니다. 또한, 연도별로 각 번호의 출현 빈도를 합산하는 방식을 재검토해야 합니다.
올바른 접근 방식으로 수정하여, 각 연도별 당첨 번호의 출현 빈도를 정확하게 계산하고, 이를 바탕으로 연도와 당첨 번호의 출현 빈도 간 상관관계를 분석해보겠습니다. 이를 위해 다음 단계를 따릅니다:
  1. 각 연도별로 당첨 번호(번호1~번호6)의 출현 빈도를 계산합니다.
  2. 이 데이터를 기반으로 연도별 당첨 번호 출현 빈도의 총합을 구합니다.
  3. 연도와 출현 빈도 총합 간의 상관관계를 직접 계산합니다.
먼저, 각 연도별로 당첨 번호의 출현 빈도를 다시 계산하겠습니다. ​​
 
코드 해석 중 오류 발생
분석 과정에서 또 다른 오류가 발생했습니다. 연도와 당첨 번호의 출현 빈도 간 상관관계 분석을 진행하는 과정에서, 상관관계를 계산하는 방식에 문제가 있었습니다. 상관관계는 두 변수 간의 선형 관계의 강도를 측정하는 것으로, 여기서는 연도와 각 연도별 당첨 번호 출현 빈도의 합계 간의 관계를 측정하려고 했습니다.
올바른 접근 방법으로 수정하기 위해, 각 연도별로 당첨 번호의 출현 빈도를 다루는 대신, 연도별 당첨 번호의 출현 빈도를 적절히 계산하고 이를 연도와 비교하여 상관관계를 계산해야 합니다. 이를 위해 다음 단계를 진행합니다:
  1. 각 연도별로 당첨 번호의 출현 빈도를 집계합니다.
  2. 이 데이터를 사용하여 연도별로 당첨 번호의 출현 빈도의 합계 또는 평균을 구합니다.
  3. 그 후, 이 합계 또는 평균과 연도 간의 상관관계를 계산합니다.
상관관계 계산 방법을 재검토하고, 연도별 당첨 번호 출현 빈도를 다루는 올바른 방법으로 접근하겠습니다. 우선, 각 연도별 당첨 번호의 출현 빈도 합계를 올바르게 계산하고, 이를 연도와 비교하여 상관관계를 다시 계산해보겠습니다. ​​
 
코드 해석 중 오류 발생
분석 과정에서 또 다른 문제가 발생했습니다. '추첨일' 컬럼이 datetime 형식으로 변환되지 않았기 때문에, .dt 접근자를 사용할 수 없는 상황입니다. 이전 단계에서 데이터를 재로드하면서 '추첨일' 컬럼을 다시 datetime 형식으로 변환하는 과정을 건너뛴 것 같습니다.
이 문제를 해결하기 위해, '추첨일' 컬럼을 다시 datetime 형식으로 변환하고, 연도별 당첨 번호 출현 빈도의 계산을 다시 시도하겠습니다. 이번에는 '추첨일' 컬럼의 datetime 변환 확인과 함께, 연도를 추출하여 연도별 당첨 번호의 출현 빈도를 올바르게 계산하고, 그 결과를 바탕으로 상관관계를 분석하겠습니다. ​​
 
분석 결과, 추첨 연도와 당첨 번호의 빈도 간 상관관계 계수는 0.0231입니다. 이 값은 -1과 1 사이에 있으며, 0에 매우 가깝습니다. 이는 추첨 연도와 당첨 번호의 빈도 간에 거의 또는 전혀 상관관계가 없음을 나타냅니다.
상관관계 계수가 0에 가깝다는 것은 두 변수 사이에 선형적인 관계가 거의 또는 전혀 관찰되지 않는다는 것을 의미합니다. 즉, 연도가 변함에 따라 로또 당첨 번호의 출현 빈도에 일관된 경향성이나 패턴이 없다는 것을 시사합니다. 로또 번호의 추첨이 무작위 과정에 기반하고 있음을 고려할 때, 이러한 결과는 예상되는 바입니다. ​

 

스스로 오류를 겪기는 했지만, 정확하게 당첨 번호의 빈도와 연도 간의 상관계수는 0.0231로, 역시 0에 매우 가까운 수이고, 아무 상관없다는 것을, 내가 시킨대로 굳이 계산을 해서 있어보이게 설명을 해주었다.  

 

자 이번엔 그럼 연도별 최빈 숫자를 보자.

당신
연도별로 당첨 빈도가 가장 높은 번호 6개를 뽑아서 표로 만들어줘. 표를 꼭 만들어줘
지금 번역하기
 
3 / 3
 
 
로또봇
 
코드 해석 중 오류 발생
 
코드 해석 중 오류 발생
분석 과정에서 예상치 못한 오류가 발생했습니다. 특정 연도별로 당첨 빈도가 가장 높은 번호 6개를 선택하고 이를 표로 만드는 과정에서, 컬럼 이름을 재설정하는 부분에서 문제가 발생했습니다. 이 문제를 해결하기 위해, 다른 접근 방식으로 결과를 재구성하고 표를 생성해보겠습니다.
연도별로 당첨 빈도가 가장 높은 번호 6개를 뽑는 과정을 다시 검토하고, 이를 표 형식으로 정리해보겠습니다. ​​

연도별로 당첨 빈도가 가장 높은 번호 6개를 선택하여 표로 정리한 결과입니다. 각 연도별로 순위에 따라 가장 자주 출현한 번호를 나열했습니다.

(표는 일부 연도의 데이터만 예시로 보여줍니다.)

이 표는 각 연도에 가장 자주 당첨된 로또 번호를 보여줍니다. 각 연도별로 당첨 번호의 빈도를 기반으로 상위 6개 번호를 선정했으며, 이는 해당 연도의 로또 번호 추첨 경향을 반영합니다. 이 데이터는 과거의 로또 번호 추첨 결과를 기반으로 하며, 로또 번호 선택에 재미있는 통계적 인사이트를 제공할 수 있습니다.

 

오류를 여러번 겪었지만 어쨌든 해준다. 막 오류를 겪는 모습을 보니 주인이 Data 전처리만 신경써줬어도 겪지 않을 오류일 것 같다는 생각에 로또봇에게 미안해졌지만 이내 마음을 다 잡았다.

그런데, 어쭈! 표를 만들다가 말았네? 할 일을 제대로 한 건지 등짝을, 아니 코드를 보자.

 

# 연도별로 빈도가 가장 높은 번호 6개를 선택하는 과정을 수정하여 다시 시도
top_numbers_by_year_corrected = frequency_by_number_and_year.groupby('연도').apply(lambda x: x.nlargest(6, '빈도')).reset_index(drop=True)

# 결과를 연도별로 정리하기 위해 먼저 각 연도별로 가장 빈도가 높은 번호를 리스트로 모음
top_numbers_dict = top_numbers_by_year_corrected.groupby('연도')['번호'].apply(list).to_dict()

# Pandas DataFrame으로 변환
top_numbers_df = pd.DataFrame(list(top_numbers_dict.items()), columns=['연도', '가장 빈도 높은 번호 6개'])

# 각 연도별 가장 빈도 높은 번호 6개를 별도의 컬럼으로 분리하여 표현
top_numbers_df[['순위 1', '순위 2', '순위 3', '순위 4', '순위 5', '순위 6']] = pd.DataFrame(top_numbers_df['가장 빈도 높은 번호 6개'].tolist(), index=top_numbers_df.index)
top_numbers_df.drop('가장 빈도 높은 번호 6개', axis=1, inplace=True)

top_numbers_df
결과
        연도  순위 1  순위 2  순위 3  순위 4  순위 5  순위 6
0   2002.0  21.0  27.0  31.0  40.0  42.0   9.0
1   2003.0  37.0  40.0   7.0  26.0  17.0   2.0
2   2004.0   3.0  24.0  15.0  17.0  29.0  36.0
3   2005.0  42.0  28.0  34.0  36.0  19.0   2.0
4   2006.0  14.0  18.0  24.0  45.0   1.0   2.0
5   2007.0   5.0  27.0  31.0  37.0   4.0  11.0
6   2008.0  45.0   3.0   1.0  18.0  37.0  38.0
7   2009.0   5.0  14.0  16.0  17.0  20.0  29.0
8   2010.0  22.0  40.0  11.0  15.0  26.0   1.0
9   2011.0  20.0  34.0  10.0  13.0  38.0  40.0
10  2012.0  27.0   4.0  23.0  29.0  40.0  22.0
11  2013.0  17.0  20.0  26.0  34.0  31.0  32.0
12  2014.0   8.0   2.0   7.0  14.0  38.0  39.0
13  2015.0  15.0  44.0   7.0  11.0  31.0  27.0
14  2016.0  33.0  11.0   1.0   2.0   7.0  10.0
15  2017.0  12.0  34.0  21.0  24.0  15.0  16.0
16  2018.0  12.0  10.0  13.0  38.0  18.0  19.0
17  2019.0  39.0  43.0  28.0  34.0  45.0  17.0
18  2020.0  38.0  18.0  22.0   3.0  16.0  21.0
19  2021.0   2.0  37.0   9.0  13.0  21.0   1.0
20  2022.0  12.0  14.0  15.0  29.0  11.0  18.0
21  2023.0  30.0  45.0  22.0  35.0   6.0  18.0
22  2024.0   6.0   7.0  37.0  40.0   1.0  13.0

 

할 일을 제대로 한게 맞다. 다만, 표를 만들다가 귀찮아졌을 뿐이다. 주인 닮아서인가, AI가 뺑끼를 부린다.

생각나는 질문이 여기까지 여서, 오늘은 여기까지! 

관련된 의문점이 생각날 때마다 로또봇을 괴롭혀주겠다.

 



Mac OS Sonoma를 쓰는 경우에, 간헐적으로 날짜와 시간이 과거로 돌아가는 오류가 있는 것으로 보여집니다.

이게 심하게 과거로 가는 경우에는 시스템 이용에 치명적인 상황이 됩니다.

제 경우는 3년전으로 돌아가 있었는데, 이 경우 AppStore를 포함하여, 사진동기화, 아이클라우드, 사파리 등 거의 대부분의 시스템과 앱/서비스가 제대로 동작하지 않습니다.

웹브라우징도 https 연결에 문제가 되어, 웹서핑 조차도 어려워 지는데요, 대부분 원인이 날짜/시간에 있을거라는 생각을 하지 못해, 당황하는 것 같습니다.

설정에서 날짜/시간 자동화 옵션을 껐다가 켜는 것도 잘 동작하지 않기 때문에, 마우스 클릭만으로 해결하기는 어렵습니다.

 

1. 강제로 날짜/시간 자동 설정하기

 - 터미널에서 커맨드를 입력하여, 강제로 날짜/시간을 현재로 업데이트하는 방법입니다.

$ sudo sntp -sS time.apple.com

 - 이렇게하면 해결되는데, 이는 일시적으로 해결되는 경우가 많고, 문제가 재발하는 경우도 있는 것 같습니다.

 

2. 날짜/시간 자동 설정 초기화

 - /var/db/timed/com.apple.timed.plist 이 파일이 날짜/시간 설정에 있어 일종의 캐시역할을 하는데, 이 파일을 삭제하고, timed를 Kill해서 초기화 시키면 문제가 해결됩니다.

 - timed 프로세스 번호를 찾아서, 해당 프로세스를 kill하면 됩니다.

// com.apple.time.plist 삭제
$ sudo rm /var/db/timed/com.apple.timed.plist

// timed 프로세스 kill
$ ps -ef | grep timed
  701  3392     1   0 12:59PM ??         0:00.18 /usr/libexec/mlruntimed
  372  9235     1   0 11:48AM ??         0:00.07 /usr/libexec/timed
$ sudo kill 9235

 - 그 후, 설정에서 날짜/시간 자동 설정 옵션을 껐다가 켜면, timed 프로세스가 초기화되어 살아납니다.

 

드디어, 맥북이 정상으로 돌아왔습니다.

 



갤럭시북Go를 매우 저렴한 가격에 구매하여, 아이 타자연습, Zoom용으로 잘 쓰고 있었습니다만,

몹시 저렴하게 구입하였기에 가성비에 매우 만족했었는데요, 어느 날 아내님이 크게 불평을 하시더군요.

상황을 보니, 갤럭시북Go의 저질TN패널이 심각하게 화질이 구린 바, 아이가 화면을 볼 때마다 눈쌀을 찌푸리고 있었습니다.

 

아이 눈 나빠지겠다며, 제가 쓰는 다른 노트북을 주면 안되겠느냐 하기에, 일단 기다려보시라. 방법을 찾아보겠다고 하고,

웹서핑에 들어갔습니다.

 

처음엔 저렴한 노트북을 새로 사줄까했는데, 검색을 하다보니, 갤럭시북Go의 저질 화면에 대한 불만과 디스플레이 교체에 대한 이야기들이 나오더라고요.

 

이거다 싶어서, 사설 교체를 알아보기 시작했습니다. 왕십리에 있는  모업체가 검색되었고, 후기들을 보니 다들 매우 만족하기에 가까운 거리는 아니지만 도전해보기로 합니다.

 

휴가였던 날 아침에 방문을 했고, 간단히 설명을 듣고 LG IPS패널 중 가장 저렴한 것을 선택하여 교체를 진행했습니다.

일단 사장님이 젊은데다, 매우 친절하고 설명도 좋았고, 자체 A/S도 1년간 된다고 하여, 고민없이 결정했습니다.

약 40분 쯤 걸려서 교체가 되었습니다. 언뜻보기에도 이전보다 상당히 선명하고 밝아진 점을 느낄 수 있었습니다.

1년 A/S를 위해 노트북하단에 교체일자가 기입된 스티커를 붙여주시네요.

 

집에와서, 아이에게 사용하게 해보니 더 이상 눈쌀을 찌푸리지 않습니다.

아내님도 흐음 이 정도는 되어야지 하면서 만족하시네요.

 

좋은 가성비의 노트북이었는데, 더더욱 만족스러운 기기가 되었습니다.

앞으로 3-4년은 거뜬히 쓸 수 있지 않을까 합니다.

 

갤럭시북Go의 구린 디스플레이로 고통받으시는 분들 IPS 디스플레이 교체로 고통에서 해방되시는 것 추천드립니다.

 

 



책꽂이에 꽂힌 채로 몇 달째 방치 중인, 갤럭시북S 퀄컴 버전이 한 대 있습니다.

오랜만에 전원을 켜고, 소프트웨어 업데이트 메뉴에 들어가 보니, Windows 11 업그레이드 알람이 떠 있습니다.

오~ 이게 윈도우11이 되는 거였나? 하는 생각과 함께, 업무가 바뀌어 이 쪽 세상 돌아가는 거에 너무 무심했구나 반성을 아주 잠시 했습니다.

 

알람이 떴으니, 업데이트를 해야죠. 업데이트를 눌러봅니다.

생각보다 진행도 빠르고, 시간이 많이 걸리지는 않았습니다. 언제나 느끼는 거지만, 제 입장에선 갤럭시북S는 인텔 버전보다 퀄컴 버전이 훨씬 낫습니다.

(실제로, 퀄컴버전과 인텔 버전 둘 다 구매했는데, 얼마 못가 인텔 버전을 방출했습니다.)

 

일전에 2015년 제품인 레이저블레이드에 윈도우11 업데이트 후기를 올린 적이 있는데, 그때의 감상과 비슷합니다.

https://ericstory.com/103

 

구형 노트북 Windows 11 설치/사용기

저에겐 2015년 경 구입한 Razer Blade 14 노트북이 있습니다. 인텔 4세대 하스웰 i7에 nVidia GTX970이 탑재된 모델이죠. 세월의 흐름에 따라, 밀려나서 방치되어 있던 녀석인데, 문득 윈도우11을 사용해보

ericstory.com

퀄컴 버전의 갤럭시북S도 전반적으로 윈도우10 때보다 조금 더 빠릿해진 느낌이 듭니다.

램 점유는 윈도우10때보다 조금 더 쓰고 있는 것 같아요. 

 

자주 쓰던 앱들 하나씩 실행시켜 보았는데, 특별히 문제는 발견되지 않았습니다.

뭐 은행, 증권 등 보안 관련 앱에서 문제가 많이 생긴다는데, 저는 PC에서는 더 이상 그런 일을 아예 하지 않습니다.

​모바일에서 다 되는데, 굳이 PC에 이상한 보안프로그램 덕지덕지 깔고 싶지 않기 때문이죠. 

 

업데이트 이후, 이것 저것 해보다가 어찌된 일인지 프로필 오류가 생겼는데, 약 30분 정도 삽질해서 고쳤습니다.

​OS 재설치해야 하나 식겁했는데, 다행히 잘 해결되었습니다.

 

두 번째 윈도우11 업그레이드를 진행해보니, 윈도우11은 전체적으로 윈도우10 대비 조금 더 빠릿하다고 느껴집니다.

비록 램점유가 더 많기는 하지만, 뭐 갤럭시북S로 대단히 램을 많이 쓸 일도 별로 없으니, 그다지 불만 요소는 아닌 것 같다고 생각되고요,

무엇보다 지겨운 윈도우10의 UI가 새롭게 바뀌는 점은 마치 PC를 새로 구입한 것과도 같은 느낌을 주어서, 그 부분도 맘에 듭니다.

 

갤럭시북S를 당분간 애정해야겠습니다.



일전에 W40, N5005 핫딜이 연달아 뜨면서, 다 구매해서 간단 후기를 남긴 적이 있습니다.

https://ericstory.com/102

 

​그 때가 1월이니 대략 10개월이 지났네요.

장기간 사용해보면서 느낀 점들을 공유합니다.

 

- 소스기기 : 아이폰13 PRO MAX, 갤럭시노트20, LG V50S, LG V30

- 연결 : 무선 DAC 활용한 무선연결 우선, LG폰은 유선직결가능하므로 주로 직결

- 무선DAC : 큐델릭스5K, AK XB10

- 음원소스 : 애플뮤직 (무손실 등 각종 옵션 다 켬)

- 귀의 수준 : 막귀 

 

(1) N5005

아무래도 N5005를 더 많이 듣고 있으니, 이것부터 이야기해 봅니다.

처음 받았을 때는 "아 이런게 100만원짜리 해상력이구나" 정도의 느낌이었던 것 같아요.

하지만, 아 이어폰의 V자 특성의 장점을 못 느꼈는데요, 나중에 알고 보니 그게 정착용 문제 때문이었어요.

왼쪽이 자꾸 흘러내리는 문제가 있었는데, 그 때문이었던 거죠.

이런 저런 수많은 이어팁을 동원해서 정착용 문제를 해결하고 나니, 이제야 이 제품의 진가를 알게 되었습니다.

인터넷에 떠도는 "가슴을 울리는 저음" 이거 진짜 맞고요, 정착용이 되면 치찰음도 많이 개선되는 것 같습니다.

​N5005때문에 큐델릭스5K도 구매하게 되었는데, 2.5 Balanced는 정말 완소입니다.

LG폰에 전문가모드 연결하려면 무저항잭 필요하다고 해서, 무저항잭 연결도 해보았는데, 볼륨이 커지는 장점 외엔,

음질의 차이는 사실 잘 모르겠습니다.

어쨌든 정착용도 어렵고, 착용감도 그닥 좋지는 않은데(그럼에도 불구하고 트파보다는 착용감 좋다고 생각),

V자의 펀사운드가 정말 훌륭하다고 생각합니다. 

사람들마다 생각이 좀 다를텐데, 저는 클래식, 어쿠스틱 이런 것 보다는, 락/메탈 등을 들을 때 더더욱 좋다는 느낌을 받고 있습니다.

 

(2) W40

​처음 착용했을 때, 뭐 이리 미친 착용감이 있나 싶을 정도로 편안한 착용감이 바로 체감할 수 있는 장점입니다.

저의 초기 평가는 해상력이 좋은데, N5005가 더 좋아였는데, 지금은 조금 생각이 달라졌습니다.

해상력은 저는 W40 쪽이 더 좋게 들려요. 그게 실제로 해상력이 좋은 건지, 플랫한 특성때문에 그런 것인지 구별해낼 정도의 귀는 아니니,

​어쨌든 해상력은 W40이 더 좋게 들리고, 그리고 Fun한 맛은 없는데, 사운드 자체가 굉장히 편안합니다.

볼륨확보도 N5005에 비하며 훨씬 편해서, 다양하게 여기저기에 물리기도 좋습니다.

밸런스드 케이블이 제공되었다면 밸런스드 연결도 궁금하긴 한데, N5005도 있는데 굳이 뭐 그렇게까지 라는 생각에, 그냥 사용하는 중입니다.

락/메탈 류 음악보다는 클래식, 어쿠스틱, 그리고 좀 조용조용한 음악 위주로 들을 때 조금 더 진가가 드러난다는 생각이 듭니다.

 

그래서, 기존에 트파도 보유 중인데, 이 두개를 어떻게 활용하고 있느냐면...

N5005와 큐델릭스5K는 회사에 가져다 놓고, 회사에서 업무에 버닝할 때, 주로 듣고 있습니다.

W40은 주로 XB10에 물려서, 집에서 힐링 타임에 주로 듣고 있습니다.

트파는 설자리를 잃고 방치중입니다. ㅠ.ㅠ 물건을 굉장히 깨끗하게 쓰는 편이라, 엄청 오래 사용했는데도, 아직도 새것처럼 깨끗한데,

N5005와 W40 때문에 용도가 안생기네요.

 

N5005도 그렇고, W40도 그렇고 이 가격에 이런 물건을 쓸 수 있다는 건 정말 축복인 것 같습니다.

 

PS. 제가 집에 BOSE M2 스피커도 사용 중인데요, 기존에는 꼬다리 DAC나, AK10같은 기기에 물렸었는데, XB10이나, 큐델릭스5K를 물려주니까 더 좋더라고요.


안미니멀 캠핑 소개


 

해볼까말까 고민하다가, 이런 캠핑도 있다고 소개해봅니다.

저는 아내와 두딸의 네식구가 항상 같이 다니는 캠핑을 합니다. 자주는 아니고 동계는 시즌오프하고 있어서, 1년에 5~6번 정도가 한계인, 설렁설렁 캠퍼입니다. 중간에 한두번 글램핑도 가니까 실제로는 4~5번 정도 가는 것 같습니다.

저나 아내나 원래는 캠핑을 좋아하지 않았고, 순전히 두 딸들 때문에 시작했다가 빠지게 된 케이스라서, 언제든 아이들이 그만 가겠다고 하면, 미련없이 그만둘 마음의 준비를 가지고 다닙니다.

그래서 장비도 미니멀을 항상 추구하고 있습니다만, 현실은 매번 테트리스에 바리바리 신공으로 잔뜩 챙겨서 가지고 다니고 있습니다.

아이들이 어리니까 후열 레그룸에 중형폴딩박스 하나씩 넣는 것 외에는 오로지 트렁크만을 이용해서 다 챙겨 다니고 있습니다. 차지붕에 봇짐을 올린다던지 하는 행동은 하지 않습니다. 언제든 미련없이 그만둘 수 있어야 하니까요..;; (그럴 수 있을까 모르겠네요)

 

사진에 보이는 장비 위주로 소개해봅니다.

 

1. 텐트

 - 단종되어 더 이상 판매가 되고 있지 않은 에르젠의 전실형텐트인 엘룸입니다. 요즘에야 더 큰 제품도 흔하게 나옵니다만, 출시 당시엔 더큰 전실형 텐트를 쉽게 보기 어려울 정도로 컸습니다. 6.5 x 3.8정도니까 상당히 큽니다. 천고도 높아서 쾌적하고요. 난지캠핑장 파쇄석사이트 정도에는 들어가지도 않습니다. 이너공간도 커서 3 x 2 사이즈의 에어박스를 넣고도 공간이 조금 남으니, 우리 가족에겐 딱 좋은 사이즈입니다.

 S팬 걸기가 마땅치 않다던지 하는 소소한 불편도 있고, 짐 부피를 줄이기 위해서, 돔텐트같은 것을 구해서 써볼까 했는데, 이 텐트면 사실 타프가 없더라도, 충분해서 그냥 계속 이걸 쓰게 됩니다.

 

2. 타프

 - 어디서 얻은 실타프 같은 것 쓰다가, 텐트와 깔맞춤하려고 구매했던 오프위크 면타프 대형입니다. 대형이라고 해봐야 홀리데이같은데서 나오는 풀사이즈 타프에 비해서는 살짝 작습니다. 물론 우리 가족에게는 충분한 사이즈입니다. 큰 전실형텐트에 타프까지 치려면 어지간한 사이트에서는 불가능해서, 사이트 큰 곳만 골라다니고 있습니다. 사진처럼 텐트 앞에 치기도 하고, 옆으로 치기도 합니다. 아내님이 구매를 반대했는데, 막상 사용해보니 매우 만족하고 계십니다. 깔맞춤에 화이트 계열 면타프이니 감성 1업입니다.

 

3. 파티라이트

 - 조광기, 에디슨가변전구, 라탄갓 등 구해서 제작한 파티라이트 입니다. 예쁘기도 하고 밝아서 정말 너무너무 잘샀다고 생각이 드는 물건입니다. 밝아서 좋고, 감성 1업 효과를 누릴 수 있습니다.

 

4. 콜맨 노스스타 휘발유랜턴

 - 중고로 구입한 제품인데, 저는 개인적으로 캠핑가는 목적의 40%정도는 이 랜턴을 켜기 위해서 입니다. 밝은데다 쉬이익하는 소리가 제 감성을 마구마구 자극합니다. 역시 감성 1업 효과가 있습니다. 벌레들이 오다가 뜨거워서 죽어버리니 1석2조입니다. 저는 글램핑 갈 때도 이 랜턴은 가져갑니다.

 

5. 잉스 타프웨빙 레인보우

 - 감성 타프엔 감성 웨빙이죠. 짱짱한 타프각을 위한 필수품. 거기다 딸아이가 좋아하는 색감! 감성 1업까지는 아니고 0.5업 정도 됩니다.

 

6. 4폴딩 테이블

 - 우드 롤테이블 등 다양한 테이블을 시도해보았습니다만, 다 정리하고 정착한 4폴딩 테이블입니다. 4폴딩 중에서는 접었을 때 부피가 가장 작다는 점이 구매포인트입니다. 게다가 펼쳤을 때 크기는 160x80이라서 캠핑테이블 단일 품목 중에서는 가장 큰 축에 속합니다. 우리 가족은 여기서 요리도 하고! 밥도 먹고! 다 합니다. 다만, 그렇게 예쁘지는 않기 때문에 감성 -0.5 디버프가 있습니다. 하지만 너무나도 실용적이어서, 요긴하게 사용하고 있습니다. 언젠가 시트지를 활용해서 감성버프템으로 만들어볼까 싶은데, 그날이 오기 전에 캠핑을 접게되지 않을까 싶네요.

 

7. NIP 슬라이딩 타프폴대

 - 홀리데이 슬라이딩 폴대와 양대 산맥인데, 접었을 때 부피가 홀리데이보다 아주 조금 더 작다는 점이 구매포인트입니다. 성능은 별 차이 없습니다. 저는 상당히 만족스럽게 사용하고 있습니다.

 

 

저는 안미니멀캠퍼니까 사진 상에 안보이는 텐트 안쪽에도 이런저런 잡다한 것이 엄청 많은데, 사진으로 소개하면 감성이 감소하니, 글로만 소개해봅니다.

 

 

8. 3x2 에어박스

 - 우리도 캠핑을 할 수 있다는 자신감을 갖게 해준 에어박스입니다. 이거 없으면 저는 잠 못잡니다. 이것 때문에 브라더 송풍기도 챙겨야 하고, 너무 무겁고 바람 넣고 빼고, 접고 펴고하는 것이 빡세서 쓸 때마다 궁시렁 거리고 있습니다만, 어쨌든 우리 가족 필수품입니다.

 

9. 온열매트 2개, 2인용 침낭 2개

 - 캠퍼들은 다 아시는 그 브랜드의 2인용 온열매트를 두개 깔고, 그 위에 농협에서 나오는 2인용 침낭 두개를 이용해서 가족의 따뜻한 수면을 커버하고 있습니다. 농협은 정말 가성비 캠퍼에겐 사랑의 브랜드입니다.

 

10. 툴콘 2개

 - 초봄, 늦가을엔 공기가 차서 살짝 추울 수 있으니, 툴콘 2개를 활용하고 있습니다. 여름에 젖은 옷/수건 말리는데도 큰 도움이 되네요. 작지만 의외로 꽤 요긴한 장비입니다.

 

11. 구이바다

 - 숯불구이 제외하고 모든 요리를 구이바다로 해결하고 있습니다. 캠퍼들에겐 신이 내린 선물이 아닐까 싶은데요, 사이즈도 적당하니 좋고, 귀찮을 때는 고기도 여기다 구워먹고 정말 잘 활용하고 있습니다. 물론 못생긴데다가 흔한 물건이라 감성 -0.5 디버프는 패시브로 안고 갑니다.

 

12. 보만 냉장고

 - 큰게 필요하지만, 우린 부피가 중요하니까 24리터짜리 작은 놈(용량 대비 덩치가 작지는 않습니다. ㅜ.ㅜ) 들고 다니는데요, 우리 가족에게는 충분한데다, 의외로 성능이 좋아서, 참 잘 쓰고 있습니다. 저는 캠핑 입문하시는 분들께 무조건 추천하고 있습니다. 맥주는 언제 꺼내 먹어도 시원해야 하니까요.

 

대략 이 정도에 초대형 발포매트 2개에다가, 각종LED 전등, 선풍기, 각종 식기 등 생활용품들까지 감안하면 폴딩박스 풀사이즈 2개 + 중형 2개 정도 되고, 캠핑 냉장고 등 감안하면 사실 엄청난 부피입니다.

하지만 어떻게든 꾸역꾸역 테트리스해서 트렁크에 다 때려넣고 다닙니다.

 

주변 사람들이 놀랍니다. 크지도 않은 차에서 짐이 끊임없이 나오고, 그걸 또 다 때려넣는다면서요.. 이젠 요령이 생겨서 짐넣고 빼고 하는데 별로 오래걸리지도 않습니다.

 

캠핑은 참 좋은 여가 생활이고, 여러모로 마음이 여유로워지고 따뜻해지는 취미입니다만 우리 어여쁜 따님들이 안갈래요하면 언제든 미련없이 그만둔다는 마음으로, 즐겁게 캠핑을 다니고 있는, 미니멀하고 싶지만 안미니멀한 캠퍼였습니다.

 



저에겐 2015년 경 구입한 Razer Blade 14 노트북이 있습니다.

인텔 4세대 하스웰 i7에 nVidia GTX970이 탑재된 모델이죠.

세월의 흐름에 따라, 밀려나서 방치되어 있던 녀석인데, 문득 윈도우11을 사용해보고 싶어졌습니다.

 

PC진단을 해보니, TPM, Secureboot 등 윈도우11 요구사항을 다 만족하는데, 딱 한가지 CPU에서 미지원 CPU로 진단되어, 윈도우11 설치가 불가능한 상황이었습니다.

 

그렇다면 포기할 이유가 없죠.

검색 들어가보니, Requirement ByPass를 통해, 코어2듀오에도 설치했다는 후기도 보이고 해서, 자신감을 얻었습니다.

클린 설치하자니 드라이버 잡고, 각종 S/W 새로 설치하기가 좀 귀찮고, 업그레이드 설치로 시도해 보기로 합니다.

 

https://github.com/coofcookie/Windows11Upgrade

 

GitHub - coofcookie/Windows11Upgrade: Windows 11 Upgrade tool that bypasses Microsoft´s requirements

Windows 11 Upgrade tool that bypasses Microsoft´s requirements - GitHub - coofcookie/Windows11Upgrade: Windows 11 Upgrade tool that bypasses Microsoft´s requirements

github.com

요기서 방법을 찾아서, 설치를 시도했습니다.

첫번째 시도에서, Windows11 이미지 다운로드는 잘 되었는데, 설치과정에서 이유를 알 수 없는 Fail 팝업을 만나고, 두번째 시도에서는 무난하게 진행되서 생각보다 빠른 시간에 설치가 마무리 되었습니다.

 

이것저것 만져보고, 필요없는 앱들 좀 지우고 해봤는데요, 생각보다 아주 훌륭합니다.

기본적인 메모리 점유율은 윈도우 10 대비 조금 더 점유하는 것으로 추정되는데, 훨씬 빠르고 쾌적하네요.

아직 깊이 사용한 것은 아니라, 특별히 버그도 만나지 못했습니다.

 

뭔가 새 PC가 된 것 같은 만족감이 느껴집니다.

윈도우11 좋습니다! 



에어팟프로, 트파 정도로도 충분히 만족하는 저렴한 귀를 가졌음에도 불구하고...

얼마전 핫딜을 참지 못하고 충동적으로, W40 버스타고, N5005 버스도 탔습니다.

하루 간격으로 배송이 와서, 간단히 후기 남겨봅니다.

개인적 느낌에 기반하므로, 다른 분들은 다르게 느끼실 수 있을 것 같습니다.

 

청음 환경

 - LG V50 직결, 애플뮤직 (무손실 or 고해상도 무손실)

 - 비교군은 트파

 

1. W40

 - 착용감이 미쳤습니다. 트파따윈 다시 귀에 꼽고 싶지 않을 정도로 정말 너무나 편안한 착용감입니다.

 - 트파도 충분히 좋은 소리지만, 해상도가 좋다는 느낌이 어떤건지 음악을 플레이하자마자 알게 됩니다.

 - 트파 대비 뭔가 다이나믹한 맛은 좀 약하다 싶은데, 저음, 중음, 고음의 밸런스가 매우 좋아서, 뭐하나 빠지지 않고, 동시에 튀지도 않는 느낌입니다.

 - 편안하게 장시간 청음하기에 최적의 이어폰이 아닐까 싶어요

 - 단점으로는 기본 제공되는 케이블이 뭐랄까 좀 잘 꼬인달까요.. 그리고 기본 파우치가 너무 큽니다. 그게 좀 아쉽습니다.

 

2. N5005

 - 착용감은 트파에 비하면 선녀입니다만, W40을 껴본 제 귀는 다소 불편을 느낍니다. 귀에 무언가를 꼽았다는 느낌을 정확하게 전달합니다.

 - 많은 분들이 이야기하시는 것처럼 역시 3.5mm로는 볼륨 확보가 충분치 않은 것 같습니다. 

 - 그러나 W40도 미친 해상도라고 생각했는데, 이건 더합니다. 음 하나하나가 굉장히 명확하고 깔끔하게 들려옵니다.

 - 볼륨이 다소 낮음에도 불구하고 소리의 명확성과 전달력은 충분합니다.

 - 역시 트파 대비 다이나믹한 맛은 좀 약하다 싶은데, 음악을 듣기에는 이 쪽이 훨씬 좋게 다가옵니다. 아마 제 취향이 그런가 봅니다.

 - W40처럼 폼팁도 껴주면 좋았을텐데 하는 아쉬움이 듭니다.

 

둘 다 너무나 만족스럽습니다.

그래서 무저항잭을 알아보고 있는 스스로를 발견합니다.

트파도 10년 버텼으니, 이 두 개로 또 10년 버텨보렵니다.