컴공 공부/데이터 분석

[데이터 분석] 주사위 게임을 이용한 파이썬 데이터 분석

무무뭉? 2021. 10. 4. 22:43

 

https://github.com/jo-gunhee/Data_Study/blob/master/week01/dice_game/dice_game.ipynb

 

GitHub - jo-gunhee/Data_Study

Contribute to jo-gunhee/Data_Study development by creating an account on GitHub.

github.com

 

확률을 공부하는데 가장 좋은 예시는 주사위입니다.

1~6이라는 경우의 수를 가지고 평균, 분산, 기댓값 등을 구해보며 확률과 통계의 기본 지식을 배울 수 있습니다.

파이썬에서도 numpy, matplotlib, pandas 등 데이터 분석을 도와주는 다양한 라이브러리가 있습니다.

데이터를 공부하며 앞으로 숙달 되어 봅시다.

 


 

import numpy as np
from scipy import stats
from matplotlib import pyplot as plt

# 1. (dice game) 1부터 6까지의 수 중에 하나의 수를 임의로 선택하는 시행을 20번 시행하여,
# 그 결과를 리스트 형태로 저장
def dice_game(number):
    dice0=[]
    for i in range(number):
        d = np.random.randint(1,7)
        dice0.append(d)
    return dice0
dice = dice_game(20)
print("dice :",dice)
print("dice 갯수 :",len(dice))

실행 결과

 

 


 

# 2. 위에서 얻은 dice의 결과값을 기준으로 각 수 (1부터 6까지) 에 해당하는 빈도를 구한 후, 
# 해당 빈도를 기준으로 확률값 확인
p_dice = [0]*6
for i in dice:
    p_dice[i-1]+=1
print("빈도 :", p_dice)


for i in range(6):
    p_dice[i] = p_dice[i]/20
print("확률 :",p_dice)

실행 결과

 


 

# 3. 위 2 번 결과를 나타내는 세로 막대 그래프
plt.bar(range(1,7),p_dice)
plt.show()







# 4. 위 2번 결과를 기준으로 하는 기대값과 분산
n= [1,2,3,4,5,6]

# 직접 함수 작성
def mean(q):
    return sum(q)/len(q)

def expec(w):
    result = 0
    for i in w:
        result+=i/len(w)

    return result

def var(s):
    vsum=0
    for val in s: 
        vsum = vsum + (val - mean(s))**2 
    variance = vsum / len(s) 
    return variance

print("이론상의 기대값 :", expec(n))
print("이론상의 분산 :", var(n))
print()
print("위 2번 실험의 기대값 :", expec(dice))
print("위 2번 실험의 분산 :",var(dice))

# numpy 활용
#num_var = np.var(dice)
#print(num_var)

3번 문제 결과
4번 문제 결과

 


 

# 5. 위의 dice game 을 20번 대신 200번 수행한다면, 
# 현재의 결과가 바뀔 수 있는 지 아니면, 유지될 수 있는가

exp_list = []
var_list = []

exp_list.append(expec(n))
var_list.append(var(n))

min0 = 20
max0 = 20001
#min0 = input("최소 숫자 :")
#max0 = input("최대 숫자 :")
while(min0 < max0):
    exp_list.append(expec(dice_game(min0)))
    var_list.append(var(dice_game(min0)))
    min0*=10
    
print(exp_list)
print(var_list)



print("\n이론상의 기대값 :", exp_list[0])
print("이론상의 분산 :", var_list[0])

print("\n20번 수행")
print("기대값 :", exp_list[1])
print("분산 :",var_list[1])

print("\n200번 수행")
print("기대값 :", exp_list[2])
print("분산 :", var_list[2])

print("\n2000번 수행") 
print("기대값 :", exp_list[3])
print("분산 :",var_list[3])

print("\n20000번 수행") 
print("기대값 :", exp_list[4])
print("분산 :",var_list[4])

 

실행 결과

 


 

plt.plot(exp_list,'ro')
plt.axis([-0.5,4.5,min(exp_list)-0.05,max(exp_list)+0.05])
plt.grid()
plt.title("수행 횟수에 따른 기대값")
plt.ylabel("기대값")
plt.xlabel("수행 횟수")
plt.xticks(np.arange(0,5,1), ['이론', '20번', '200번', '2,000번','20,000번'])
plt.hlines(exp_list[0],0,4,color="blue", linestyles='solid', linewidth=2)
plt.show()


plt.plot(var_list,'ro')
plt.axis([-0.5,4.5,min(var_list)-0.05,max(var_list)+0.05])
plt.grid()
plt.title("수행 횟수에 따른 분산값")
plt.ylabel("분산값")
plt.xlabel("수행 횟수")
plt.xticks(np.arange(0,5,1), ['이론', '20번', '200번', '2,000번','20,000번'])
plt.hlines(var_list[0],0,4,color="blue", linestyles='solid', linewidth=2)
plt.show()

print("결론 : Dice game의 수행 횟수를 증가시키면 이론상의 수치로 점차 가까워지는 모습을 보여준다.")
print("따라서 수행횟수에 따라 현재의 결과는 얼마든지 변할 수 있다.")

실행 결과

 


 

ps: 만약 plt를 통해 그래프를 그렸는데 한글 깨짐 현상이 발생한다? 하시면 

import os
if os.name == 'posix':
    plt.rc("font, family="AppleGothic")
else:
    plt.rc("font", family="Malgun Gothic")

위 코드를 넣어주시면 됩니다~

 

'컴공 공부 > 데이터 분석' 카테고리의 다른 글

파이썬 graphviz 에러 해결  (3) 2021.10.07