2026. május 27., szerda

Skandi metrikus modellezés grafikus formában



import numpy as np
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