import matplotlib.pyplot as plt
from collections import Counter
from scipy import stats
import math
import random
import os
class SkandinavLottoElemzo:
def __init__(self, huzasok_adat):
"""
Initializes the analyzer with provided draw data
Args:
huzasok_adat: List of lists containing the draw numbers
"""
self.huzasok = huzasok_adat
self.huzasok_szama = len(huzasok_adat)
self.szamok_darabja_huzasnak = len(huzasok_adat[0])
self.osszes_szam_hatar = 35 # Skandináv lottó: 35-ből
# Összes szám kinyerése
self.osszes_szamok = []
for huzas in huzasok_adat:
self.osszes_szamok.extend(huzas)
self.osszes_szamok_darab = len(self.osszes_szamok)
def szam_gyakorisag(self):
"""Calculates frequency of each number"""
gyakorisag = Counter(self.osszes_szamok)
# Teljes lista 1-35-ig
teljes_gyakorisag = {i: gyakorisag.get(i, 0) for i in range(1, self.osszes_szam_hatar + 1)}
return teljes_gyakorisag
def leggyakrabban_huzott(self, darab=10):
"""Returns most frequently drawn numbers"""
gyakorisag = self.szam_gyakorisag()
rendezett = sorted(gyakorisag.items(), key=lambda x: x[1], reverse=True)
return rendezett[:darab]
def legritkabban_huzott(self, darab=10):
"""Returns least frequently drawn numbers"""
gyakorisag = self.szam_gyakorisag()
rendezett = sorted(gyakorisag.items(), key=lambda x: x[1])
return rendezett[:darab]
def statisztikai_mutatok(self):
"""Calculates statistical measures"""
gyakorisag = self.szam_gyakorisag()
values = list(gyakorisag.values())
# Filter out zeros (numbers never drawn)
values_nonzero = [v for v in values if v > 0]
return {
'átlag': np.mean(values_nonzero),
'szórás': np.std(values_nonzero),
'minimum': np.min(values_nonzero),
'maximum': np.max(values_nonzero),
'medián': np.median(values_nonzero),
'szóródási együttható': np.std(values_nonzero) / np.mean(values_nonzero) if np.mean(values_nonzero) > 0 else 0,
'darab': len(values_nonzero)
}
def parity_arany(self):
"""Calculates even/odd ratio"""
paros = 0
paratlan = 0
for szam in self.osszes_szamok:
if szam % 2 == 0:
paros += 1
else:
paratlan += 1
osszes = paros + paratlan
return {
'paros': paros,
'paratlan': paratlan,
'paros_szazalek': paros / osszes * 100,
'paratlan_szazalek': paratlan / osszes * 100
}
def osszeg_eloszlas(self):
"""Analyzes distribution of sum totals"""
osszegek = [sum(huzas) for huzas in self.huzasok]
return {
'összegek': osszegek,
'átlag': np.mean(osszegek),
'szórás': np.std(összegek),
'minimum': np.min(osszegek),
'maximum': np.max(osszegek),
'medián': np.median(osszegek)
}
def normal_eloszlas_teszt(self):
"""Tests if data follows normal distribution"""
gyakorisag = self.szam_gyakorisag()
values = [v for v in gyakorisag.values() if v > 0]
if len(values) < 3:
return {'lehetetest': False, 'hiba': 'Túl kevés adat'}
try:
# Shapiro-Wilk test
shapiro_stat, shapiro_p = stats.shapiro(values)
# Kolmogorov-Smirnov test
ks_stat, ks_p = stats.kstest(values, 'norm',
args=(np.mean(values), np.std(values)))
return {
'shapiro_stat': shapiro_stat,
'shapiro_p_érték': shapiro_p,
'ks_stat': ks_stat,
'ks_p_érték': ks_p,
'normalis_eloszlas': shapiro_p > 0.05
}
except Exception as e:
return {'lehetetest': False, 'hiba': str(e)}
def szimulalj_huzast(self, darab=5, szam_random=True):
"""Simulates new draws"""
if szam_random:
random.seed()
np.random.seed()
else:
random.seed(42)
np.random.seed(42)
eredmenyek = []
for _ in range(darab):
huzas = sorted(random.sample(range(1, self.osszes_szam_hatar + 1),
self.szamok_darabja_huzasnak))
eredmenyek.append(huzas)
return eredmenyek
def szamitott_eselyek(self):
"""Calculates mathematical probabilities"""
# Combination: C(n, k)
osszes_kombinacio = math.comb(self.osszes_szam_hatar, self.szamok_darabja_huzasnak)
return {
'összes_kombinacio': osszes_kombinacio,
'telitalalat_esely': f"1:{osszes_kombinacio:,}",
'valozhezetesseg': 1/osszes_kombinacio * 100,
'varhato_ertek': (1 + self.osszes_szam_hatar) / 2 * self.szamok_darabja_huzasnak
}
def korelas_matrix(self):
"""Calculates correlation between numbers (appearing together)"""
gyakorisag = self.szam_gyakorisag()
# Numbers that appeared at least once
aktiv_szamok = [szam for szam, gyak in gyakorisag.items() if gyak > 0]
# Create co-occurrence matrix
korrelacio = {}
for szam1 in aktiv_szamok:
korrelacio[szam1] = {}
for szam2 in aktiv_szamok:
if szam1 != szam2:
# Count how often they appear together
egyutt = sum(1 for huzas in self.huzasok
if szam1 in huzas and szam2 in huzas)
korrelacio[szam1][szam2] = egyutt
return korrelacio
def grafikon_gyakorisag(self, elment=True):
"""Creates frequency bar chart"""
gyakorisag = self.szam_gyakorisag()
szamok = list(range(1, self.osszes_szam_hatar + 1))
values = [gyakorisag[szam] for szam in szamok]
plt.figure(figsize=(35, 7))
plt.bar(szamok, values, color='steelblue', alpha=0.7, edgecolor='black')
plt.title(f'Skandináv Lottó - Számok Gyakorisága\n({self.huzasok_szama} húzás, {self.szamok_darabja_huzasnak} szám/húzás)',
fontsize=14, fontweight='bold')
plt.xlabel('Szám', fontsize=12)
plt.ylabel('Hányszor húzták', fontsize=12)
plt.xticks(range(1, self.osszes_szam_hatar + 1))
plt.grid(axis='y', alpha=0.9)
átlag = np.mean([v for v in values if v > 0])
plt.axhline(y=átlag, color='red',
Nincsenek megjegyzések:
Megjegyzés küldése