[ 분석 ] Match 3 Game 예측 결과
분석
클리어에 필요한 스왑 횟수에 따른 난이도 설정하였으나, 일반 블록의 랜덤성으로 인해 같은 레벨을 반복하더라도 각각의 클리어에 필요한 스왑 횟수가 다르다. 따라서 이를 반복하여 모평균을 추정하고자 한다. 이러한 추정을 위해 적절한 반복 횟수가 필요하다.
해당 맵에서 반복 플레이 했을 때 아래와 같은 결과를 확인할 수 있다.
반복 횟수에 따른 평균 이동 횟수를 측정 시, 일정 이상의 반복에서 수렴하는 것을 확인할 수 있다.
※ 방해 횟수 : 매치 3 게임 자동 플레이 시, 스왑을 통해 매치를 발생시킬 수 있는 블록을 선택, 스왑하여 매치를 발생시킨다. 이를 매치 가능 경우의 수라고 한다. 이 때, 맵에 스왑이 불가능한 특수 블록이 배치된 경우, 이로 인해 스왑을 통해 매치를 발생시킬 수 없는 경우의 수가 발생할 수 있다. 이러한 특수 블록에 의해 매치 가능 경우의 수가 감소한 횟수를 방해 횟수라고 한다.
표본을 매치 가능 횟수(= 스왑매치 경우의 수)에 따라 난이도를 나누고, 이를 반복 측정했을 때,
※ 스왑매치 경우의 수 스왑을 통해 매치를 발생시키기 위해서는 매치 발생 조건, 수직 혹은 수평으로 같은 종류 일반 블록 3개 연속 배치를 충족해야 한다. 일정 확률로 랜덤하게 생성되는 일반 블록을 변수로 두고 맵의 각 셀을 일반 블록이 생성될 빈 셀과 특수 블록 셀로 구분 시, 맵의 크기에 따라 각 셀에서 매치 발생 조건을 충족할 수 있는 최대 경우의 수가 정해진다. 그리고 이러한 매치 발생 조건 충족을 위해 사용자는 스왑을 통한 블록 이동을 사용하므로, 스왑을 통해 매치 발생 조건을 충족할 수 있는 경우의 수, 스왑매치 경우의 수를 계산한다.
매치 가능 횟수에 따른 평균 이동 횟수 그래프와
아래와 같은 신뢰 구간 회귀 분석 그래프를 얻을 수 있었다. (X를 매치가능횟수로 두고, 평균 이동과 이동 표준편차를 회귀 분석)
선형 방정식
- Regression Equation for Mean: y_mean = 25.254905852 + -0.004462313 * x
- Regression Equation for Standard Deviation: y_std = 7.356382467 + 0.000697502 * x
그리고 이를 회귀 분석에 포함하지 않은 데이터에 대입했을 때 대부분 예측 구간에 존재
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from scipy.stats import t
# 입력한 데이터를 data_str에 대입
data_str = """
664 624 548 488 440 300 256 113 92
22.449 22.765 22.753 22.901 23.228 23.524 23.768 25.19 24.9865
7.816197635 7.962630014 7.791748627 7.70310768 7.580748636 7.274261574 7.310943917 7.923212016 7.303286024
"""
# 데이터를 공백으로 분리하여 실수 리스트로 변환
data = [float(num) for num in data_str.split() if num.strip()]
num_data_points = len(data) // 3
X = data[0:num_data_points] # 첫 번째 줄
Y_mean = data[num_data_points:num_data_points *2] # 두 번째 줄
Y_std = data[num_data_points *2:num_data_points *3] # 세 번째 줄
# 독립 변수의 최솟값 조건
min_threshold = 0
# 독립 변수가 최솟값 조건을 만족하는 데이터 필터링
X_filtered = []
Y_mean_filtered = []
Y_std_filtered = []
for i in range(len(X)):
if X[i] >= min_threshold:
X_filtered.append(X[i])
Y_mean_filtered.append(Y_mean[i])
Y_std_filtered.append(Y_std[i])
# 다중 선형 회귀 모델 생성 및 학습
model_mean = LinearRegression()
model_mean.fit(np.array(X_filtered).reshape(-1, 1), Y_mean_filtered)
model_std = LinearRegression()
model_std.fit(np.array(X_filtered).reshape(-1, 1), Y_std_filtered)
# 회귀 계수 출력
coefficient_mean = model_mean.coef_[0]
intercept_mean = model_mean.intercept_
coefficient_std = model_std.coef_[0]
intercept_std = model_std.intercept_
print("Coefficients for Mean:", coefficient_mean)
print("Intercept for Mean:", intercept_mean)
print("Coefficients for Standard Deviation:", coefficient_std)
print("Intercept for Standard Deviation:", intercept_std)
# 예측 구간 계산
confidence_level = 0.95 # 신뢰 수준 (95%)
degrees_of_freedom = len(X_filtered) - 2 # 자유도 (n - p - 1)
# 표준 오차 계산
y_mean_pred = model_mean.predict(np.array(X_filtered).reshape(-1, 1))
y_std_pred = model_std.predict(np.array(X_filtered).reshape(-1, 1))
residuals_mean = Y_mean_filtered - y_mean_pred
residuals_std = Y_std_filtered - y_std_pred
std_error_mean = np.sqrt(np.sum(residuals_mean ** 2) / degrees_of_freedom)
std_error_std = np.sqrt(np.sum(residuals_std ** 2) / degrees_of_freedom)
# t 분포의 임계치 계산
t_critical = t.ppf(1 - (1 - confidence_level) / 2, degrees_of_freedom)
# 예측 구간 계산
prediction_interval_mean = t_critical * std_error_mean
prediction_interval_std = t_critical * std_error_std
print("Prediction Interval for Mean:", prediction_interval_mean)
print("Prediction Interval for Standard Deviation:", prediction_interval_std)
print(coefficient_mean)
print(intercept_mean)
print(prediction_interval_mean)
print(coefficient_std)
print(intercept_std)
print(prediction_interval_std)
추가적으로 서로 다른 타겟 수를 가진 맵에서 이를 확인, 95%의 신뢰 구간에 포함
선형 방정식(X를 타겟 수로 두고, 평균 이동과 이동 표준편차를 회귀 분석)
- Regression Equation for Mean: y_mean = -4.40035238095238+ 1.80364761904761 * x
- Regression Equation for Standard Deviation: y_std = 4.20292256088571 + 0.236694051219047 * x