개발

따라하는 python 로또 분석(4)

Jest 2016. 7. 11. 22:57


이 글은 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 함수를 조금 수정하면 각 자리별 숫자가 동일할 때의 간격을 뽑아볼 수도 있습니다.

이 부분은 여러분께 과제로 남기도록 하겠습니다. (귀찮아서 그러는 건 아니라고 믿어주세요;;;)



전체 소스코드는 아래에 올려두었습니다.

lotto.py




이상으로 이번 포스트를 마치겠습니다.

다음 포스트에서도 다른 방법으로 데이터를 분석해 보도록 하겠습니다.



읽어 주셔서 감사합니다.