'Study'에 해당되는 글 4건

  1. ChatGPT로 로또 당첨 번호 분석, 예측하기
  2. 초보 아빠의 아기이름 작명하기
  3. 바탕화면에 dxva_sig.txt 파일이 생기는 현상
  4. Source Insight 3.5 떠있는 창 10개로 제한하기 3

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

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

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

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

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

 

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

 

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

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

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

 



아기 이름 작명에 관련된 문의들이 많이 보여,

한달 전부터 아기 이름을 고민했고, 출생신고한지 이제 일주일남짓 된 초보아빠로서,,,

제가 경험하면서 느낀 작명방법을 공유해봅니다.

팁인지 경험인지 좀 애매하지만, 아기 이름을 고민하게될 저같은 초보 아빠들에게는 팁이 될 것 같아,

남깁니다.

 

먼저 돌림자를 쓰는 경우와 안쓰는 경우가 있을텐데, 제 경우는 안쓰는 것으로 결론냈기 때문에,

돌림자를 쓰지 않는 경우를 기준으로 진행합니다. (쓴다해도 크게 달라지지는 않을 것 같습니다.)

 

작명에 정답은 없습니다만, 아기 이름 때문에 작명이니 명리학 같은 책들도 읽고,

나름의 큰 기준을 세운 것이라 대략 이 정도면 나쁜 이름을 선택하게 되는 일은 방지할 수 있지 않을까 합니다.

 

<1단계 : 한글 발음으로 이름 후보 정하기>

 

먼저 순수하게 한글 발음을 기준으로 이름 후보들을 정해봅니다.

한글 발음으로 이름 후보는 많아도 됩니다.

그 많은 이름 후보들을 놓고, 아래의 원칙을 기준으로 걸러내면 좋겠습니다.

 

1. 발음이 어렵지 않고 쉬울 것

 - 종성이 들어가는 글자들이 대체로 초중성만으로 된 글자보다는 어렵습니다.

 - 그렇다고 받침글자를 다 빼야한다는 것은 아닙니다. 대략 ㅇ,ㄴ,ㄱ,ㅁ 정도의 받침은 발음이 나쁘지 않습니다.

 

2. 성과 붙여 읽었을 때 부정적인 단어가 연상되지 않을 것

 - 이건 아이의 미래 별명을 생각하면 매우 당연하겠지요.

 

3. 이름을 불렀을 때 스펠링이 명확할 것

 - 발음은 하나지만 스펠링이 복수로 나오는 조합은 가급적 피하는 것이 좋습니다.

 - 예를 들어, "연아" 라는 이름은 발음은 "여나"지만 이름을 듣는 사람은 "연아", "여나", "연하", "연화" 인지

   헤깔려서 확인하게 됩니다.

 

4. 좋은 뜻을 갖는 이름일 것

 - 좋은 뜻은 부모가 주기 나름이겠죠?

 

5. 글로벌 시대에 따라, 영어로도 자연스럽게 발음이 되면 더욱 좋겠지요?

 - 한글이지만 영어이름도 되는 것들이 괜찮더군요.

 - 다만 주의하실 것은, "유진" 처럼 한국에서는 통상 여자이름이지만, 영어(Eugene)로는 남자이름이 되는 것은

   아이의 성별에 따라 취사선택하시면 됩니다.

 

여기까진 시대상에 따른 기본적인 원칙인 것 같습니다.

대체로 이름은 이 정도면 문제없다 생각하지만, 아이 이름이라는 것이 집안 어른들 입장이라는 것도 있어서,

사주니 명리학이니 좀 따지게 됩니다.

이제부터는 사주나 명리학등을 가급적 따르고 싶은 분들을 위한 추가 원칙입니다.

 

6. 성의 초성, 종성을 기준으로 이름의 초성+종성+초성+종성의 조합이 오행의 상극이 아닌 상생의 조합이 되도록 할 것

순서에 상관없이 성의 초성+종성을 기준으로, 이름이 상생의 흐름을 갖는 이름이 좋은 이름입니다.

이름 자음의 '순서'가 아니라, '조합'이 상생이어야 합니다. 순서까지 맞추실 필요는 없다는 이야기입니다.

각 오행에 해당하는 초성, 종성은 다음과 같습니다.

 

7. 이름 두 글자의 한글 획수가 짝+홀 혹은 홀+짝의 조합이 되는 것이 음양의 조화입니다.

짝+짝, 홀+홀은 음양의 밸런스가 맞지 않아 통상 좋은 이름은 아닌 것으로 봅니다.

 

<2단계. 발음에 따라 한자 정하기>

 

1단계에서 아마도 괜찮은 한글 이름이 서너가지 추려지셨을 것입니다.

사실 여기까지만해서 이름을 정하셔도 됩니다.

그러나, 우리나라는 아직까지는 한자문화권이고, 역시 한자 이름을 필요성을 부정할 필요는 없으니,

이제 한자를 정해보겠습니다.

한자는 뜻도 중요하지만 사주의 영향을 받습니다.

따라서, 아래의 원칙에 따라 한자를 추려가시면 됩니다.

 

1. 생년월일시의 사주를 보면 타고난 오행이 나오며, 그 중에 부족하거나 빠진 기운을 보완해주는 것이 기본 개념입니다.

 - 수가 부족하다면, 삼수변이 들어간 글자를.. 목이 부족하다면 나무목변이 들어간 글자를..

 - 토가 부족하다면 흙토자나 계집녀자가 들어간 글자로 추려내시면 됩니다.

 - 보완 우선 순위는 사주 오행에 아예 없는 기운은 1순위, 있지만 개수가 부족한 기운은 2순위입니다.

 

2. 이름에 사용되는 한자는 대법원에서 정한 인명용 한자 사전이 있습니다. (네이x 인명용 한자사전 참조)

 - 여기서 찾으시면 나중에 이름에 사용될 수 없는 글자라 다시 골라야하는 불편을 사전에 제거할 수 있습니다.

 - 추가. 인명용 사전에 각 글자마다 오행의 어디에 해당하는지를 표기해둔 사전도 있으니, 참고하시면 1단계를 좀더 수월하게 할 수 있습니다.

 

3. 한자의 획수가 이름 두글자에서 1단계에서 했던 것처럼 홀+짝, 짝+홀의 조합을 갖도록 하여 음양밸런스를 맞춥니다.

 

3.5 삼원오행을 고려하는 경우도 있으나, 통상 삼원오행은 이름에서는 고려치 않으니,

   누가 삼원오행상 맞지 않다고 하거든 가벼이 무시하십시오.

 

4. 뜻도 고려합니다.

 - 물론 인명용 한자라서 나쁜 뜻은 잘없으나, 별다른 뜻이 없는 글자도 있으니, 기왕이면 좋은 뜻의 글자여야겠지요.

 - 당연히 두글자의 조합으로부터 좋은 뜻을 해석하는 것은 오로지 아빠의 몫입니다.

 

이렇게 고려하여 추려진 글자가 제대로 고른 것인지 확인하고 싶으시겠죠?

사실 여기까지해서 지었으면 개인적으로 무방하다봅니다만...

검증과 집안 어른들 의견 등을 두루 고려하여 아래의 5,6번을 옵션으로 보시면 되겠고,

아니면 바로 7번으로 가시면 됩니다.

 

5. 작명 사이트 등을 통해 고른 이름을 검증해봅니다.

 - 작명사이트는 위의 원칙들을 DB화하여 손쉽게 검증하도록 도움을 줍니다.

 - 여러 사이트를 봤지만, "아기이름 작명연구소"가 사용하기 가장 편리했고, 이름을 정하려는 아빠들에게

   실질적인 도움을 주고 있었습니다. 물론 취향에 따라 다른 사이트를 이용하셔도 무방합니다.

   작명 DB는 거의 대부분 비슷합니다. 그리고 무료는 서비스의 제한이 많아 불편하니 2만원 결제하면 더욱 편리합니다.

   대부분의 사이트가 작명료로 2만원을 받으며, 결제시점부터 한달간 무제한 이용이 가능합니다.

 

6. 추가 검증하기.

 - 여기까지 오셨으면 사실 거의 막바지입니다.

 - 몇가지 이름 후보들이 사이트를 통해서 정규화된 점수로 표현이 되면, 가장 좋은 이름을 고를 수 있습니다.

 - 그러나, DB화된 작명 이외에 고려해야 하는 것들이 있습니다.

  (예를 들면, 인명용 한자이기는 하나 실제로는 성에만 쓰이고 이름에는 쓰지 않는다던지,

  사주와 관계없이 이름에 쓰면 좋지 않은 글자라던지 이런 부분은 사이트에도 안나옵니다.)

 - 그리고, 집안 어른들께서 자신이 아는 작명소를 활용하고픈 마음이 있습니다.

 - 그런 부분을 고려하여, 사이트로 부터 이름을 3가지 정도 뽑아내고, 이 3가지 후보를 작명소 혹은 집안 어른이 아는 곳 등에

   보내어, 어느 이름이 좋겠느냐라고 검증을 한번 더 받는 것이죠.

 - 대부분의 작명소도 위의 과정을 거치므로, 내가 뽑은 이름에서 좋은 이름이 골라집니다.

 - 여기서 내가 밀고 싶은 이름이 잘 골라지도록 팁을 드리자면, 5번까지 진행하셔서,

   한글이름은 고정변수로 두고, 한자만 몇가지 조합으로 보내시는게 좋습니다. 

   한글과 한자 모두 다른 조합을 보내시면, 거꾸로 쓸 수 있는 이름이 하나도 없다는 답변이 올 수도 있습니다.

 - 드디어, 내가 뽑은 이름에서 좋은 이름이 선정되었으니, 이제 출생신고만 하시면 되겠습니다.

 

7. 믿기

 - 내가 지은 이름입니다. 그리고 나름 고려할 것들을 충분히 고려했습니다.

   그러나 간혹, 누군가 그 이름은 안좋다는 말도 할 수 있습니다.

   특히 작명소 같은데서 문제를 삼는 경우도 있습니다.

   무시하세요. 특히 개명 어쩌구하면 과감히 무시하세요.

   부모로서 아이에게 필요한 이 많은 것들을 고려하여 스스로 만든 좋은 이름임을 믿으세요.

   이름이 아이의 운명을 바꾸지는 않습니다.

   좋은 이름이라 믿고 애정을 가지고 잘 키우는 것이 무엇보다도 더 중요합니다.

 

PS.

사실 사이트를 이용하고 작명소를 이용한다면, 위에 쭈욱 언급한 절차들이 별로 필요없을 수 있습니다.

그럼에도 위의 절차들을 쓴 것은, 기왕에 짓는 이름이면 부모의 의지가 가급적 조금이라도 더 반영되기를 바라기 때문입니다.

적어도 남이 정해준 이름이 아닌 내가 정한 이름이고, 그 이름이 좋은 이름이 되도록 했으면 하는 마음에,

나름의 절차를 정리해본 것이라 이해해주시면 되겠습니다.

 

출산을 앞둔 혹은 막 출산한 예비 아빠 엄마 여러분,,,

미리 축하드리며, 예쁘고 좋은 이름 잘 지으시기를 바랍니다.



ATI 비디오카드를 사용하는 PC의 경우,
시도 때도 없이 바탕화면에 dxva_sig.txt 파일이 생성되는 경우가 있다.
지워도 다시 생기고, 지워도 다시 생기므로 여간 짜증나는 것이 아니다.

이는 WMA Video에 대한 가속 기능때문에 발생하는 현상인데,
한번 이 현상이 발생하기 시작하면, 익스플로러 상에서, WMA video가
깨지는 문제도 동반하게 되는 경우가 많으므로,
가급적이면, ATI비디오 카드의 WMA Video 가속 기능을 OFF시켜두기를 권한다.

WMA가속을 끄기 위해서는 ATI의 [Catalyst Control Center] - [Video] - [All Setting] 메뉴에서 Windows Media Settings 항목의 'Windows Media Video Acceleration' 의 체크를 해제하면 된다.

만약 ATI Catalyst 4.x 버전의 드라이버 사용자라면 [제어판] - [디스플레이 등록 정보] - [설정] - [고급] - [옵션]로 들어가서 WMV 가속 체크를 마찬가지로 해재 시키면 된다.



Eternity74님의 블로그에서 얻은 아주 유용한 Tip!
Eternity74님 감사합니다.^^;

Source Insight로 디버깅을 하다보면, 떠있는 창이 50-60개에 육박하는 경우가 많은데,
이런 경우, Source Insight가 잡아먹는 리소스가 장난 아니다.
컴퓨터가 버벅거리기 일쑤~!
이 Tip을 적용하면, Source Insight에서 창이 10개이상이 뜨면, 오래된 창부터 자동으로 닫아준다.

이 매크로를 사용하려면,
Options > Preference > General > Enable event handler 에 체크가 되있어야 한다.
그 후, Base Project의 Utils.em파일을 열어 다음과 같은 function을 추가한다.

event DocumentOpen(sFile)
{
   nHoldWnd = 10
   winCnt = WndListCount()
   if(winCnt > nHoldWnd) {
      hWnd = GetCurrentWnd()
      while(nHoldWnd-- != 0) {
         hWnd = GetNextWnd(hWnd)
      }

      while(hWnd != 0) {
         hTmpWnd = GetNextWnd(hWnd)
         CloseWnd(hWnd)
         hWnd = hTmpWnd
      }
   }
}


event 로 시작하는 함수는 source Insight 에서 정의하는 event handler인데, DocumentOpen()이라는 함수는 새로운 파일을 open할때 불려지는 이벤트 핸들러이다.

적용해보니 잘된다. ㅎㅎㅎ
참고로 이 방법을 적용할 수 있는 Source Insight 버전은 3.50.0045 이상이어야 한다.