따라하는 python 로또 분석(4)
이 글은 python 초보자들을 대상으로 하는 로또 데이터 분석에 관련된 글입니다.
이전 포스트는 아래 링크를 따라가시기 바랍니다.
2016/07/04 - [개발] - 따라하는 python 로또 분석(3)
2016/06/28 - [개발] - 따라하는 python 로또 분석(2)
2016/06/21 - [개발] - 따라하는 python 로또 분석 (1)
이번 포스트에서는 다른 분석을 한번 해 보도록 하겠습니다.
각 회차별 추첨 번호간 거리를 한번 알아보는 건 어떨까요? 갑자기 제가 궁금해졌습니다. -_-;
아래는 제 1회차 당첨번호 + 보너스 번호입니다.
10, 23, 29, 33, 37, 40, 16
첫 번째 번호가 10일 때 두 번째 번호 사이의 거리는 23 - 10 = 13입니다.
두 번째 번호와 세 번째 번호 사이의 거리는 얼마일까요? 제 질문이 어려웠나요? ^^;
정답은 29 - 23 = 6입니다.
이런 방식으로 각 번호 사이의 거리를 계산해보면 아래와 같습니다.
아, 물론 거리는 절대값입니다 ^^
첫 번째 자리 수가 10일 때, 13, 6, 4, 4, 3, 24
자, 이제 python 코드로 해볼까요?
참, 절대값으로 변환하는 python 함수는 abs() 입니다. ^^
아래는 거리를 계산하기 위해 추가된 distance 함수입니다.
def distance():
db = MySQLdb.connect(host="localhost", user="lotto", passwd="lotto", db="lotto")
cursor = db.cursor()
try:
cursor.execute("select * from data")
results = cursor.fetchall()
for row in results:
print(row[0], "회차: ", end = "")
print("1'st", row[1], "| ", end = "")
for i in range(1, 7):
print(abs(row[i + 1] - row[i]), " ", end="")
print(" ")
except:
print(sys.exc_info()[0])
cursor.close()
db.close()
위의 코드를 추가하고 main 함수를 아래와 같이 수정합니다.
def main():
last = getLast()
dblast = checkLast()
if dblast < last:
print("최신 회차는 " + str(last) + " 회 이며, 데이터베이스에는 " + str(dblast) + "회 까지 저장되어 있습니다.")
print("업데이트를 시작합니다.")
crawler(dblast, last)
insert()
#analysis()
distance()
if __name__ == "__main__":
main()
이제 코드를 실행하면 아래와 같이 출력됩니다.
어느새 709회차 까지 왔군요. ^^;
그런데 위의 결과를 보니 각 데이터를 사이의 연관성이 잘 눈에 띄지 않습니다.
로또 번호는 정말로 랜덤인걸까요? 아니면 모수가 적어서 눈에 안 띄는 걸까요?
혹시 첫 번째로 뽑인 숫자들이 동일할 때 각 회차별 번호 간 거리는 어떻게 되는지 궁금하시지 않나요? ^^;
distance 함수를 아래와 같이 수정해 보겠습니다.
그냥 sql 문만 아래와 같이 수정하면 됩니다. ㅎㅎㅎ
cursor.execute("select * from data order by `1` asc")
수정된 distance 함수입니다.
def distance():
db = MySQLdb.connect(host="localhost", user="lotto", passwd="lotto", db="lotto")
cursor = db.cursor()
try:
cursor.execute("select * from data order by `1` asc")
results = cursor.fetchall()
for row in results:
print("1'st", row[1], "| ", end="")
for i in range(1, 7):
print(abs(row[i + 1] - row[i]), " ", end="")
print(" ")
except:
print(sys.exc_info()[0])
cursor.close()
db.close()
출력 결과를 보기 좋도록 하기 위해 회차 정보를 살짝 뺐습니다. ^^;
위의 코드를 실행한 결과는 아래와 같습니다.
예전 포스트에서의 기억을 떠올려보면 첫 번째 숫자로 가장 많이 나온 숫자는 1이었습니다.
위의 실행 결과에서는 잘렸지만, 스크롤을 올려 첫 번째 숫자로 1이 나왔을 때의 숫자 간격을 보면 아래와 같습니다.
제일 많이 나온 것 치고는 별로 공통되는 점은 없어 보입니다.
아쉽게도 이 방법으로는 로또 1등 당첨 숫자 예측이 어렵겠네요 ㅠ_-
위의 distance 함수를 조금 수정하면 각 자리별 숫자가 동일할 때의 간격을 뽑아볼 수도 있습니다.
이 부분은 여러분께 과제로 남기도록 하겠습니다. (귀찮아서 그러는 건 아니라고 믿어주세요;;;)
전체 소스코드는 아래에 올려두었습니다.
이상으로 이번 포스트를 마치겠습니다.
다음 포스트에서도 다른 방법으로 데이터를 분석해 보도록 하겠습니다.
읽어 주셔서 감사합니다.