<jupyter_start><jupyter_text>Bayesian inferenceI denne notebooken skal vi lage en statistisk modell for å estimere fordelingen av e-henvendelse behandlingstiden. Dette er kun et eksperiment som skal brukes til å vise hvordan en bygger en statistisk modell som kan kombineres med andre analyser som tidsserie analyser av innkomst og Deep Learning (CNN/RNN) for å predikere innkomst og behandlingstid av e-henvendelser. Modellen er tenkt å bli brukt en prognosemodellen.**NB:** Dette er kun et eksperiment som er ment som proof of concept. Det bør gjøres grundigere analyser og modell-sjekking...  Innhenting av dataFor å kjøre denne modellen, var jeg nødt til å kjøre python skriptet i Linux (WSL2) da verken Pymc3 eller Stan fungerte i Windows p.g.a. C++ compiler issues.Det var i tillegg en begrensning med tid. Derfor, importeres filen til (Windows subsystem for linux) da det er lettere en å lage kobling til DVH.<jupyter_code>import pymc3 as pm
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import optimize
import arviz as az<jupyter_output><empty_output><jupyter_text>Data innlesing og prep 1. Leser inn filen 2. Preparerer dataen<jupyter_code># Leser filen
df = pd.read_csv('ehenBehandlingstid.csv')
df.head()<jupyter_output><empty_output><jupyter_text>Til dette formålet er vi kun interessert i antall behandlingsdager.<jupyter_code>df = df['Behandlingstid']
df.describe().transpose()<jupyter_output><empty_output><jupyter_text>Visualisering<jupyter_code>plt.figure(figsize=(20, 10))
plt.hist(df, bins=100)
plt.grid()
plt.xlabel('antall dager')
plt.ylabel('Antall')
plt.title('Fordelingen av antall behandlingsdager')
print(f'Antall 0-dager behandlingstid: {len(df[df==0])}')
print(f'Antall dager behandlingstid over 100: {len(df[df>0])}')<jupyter_output>Antall 0-dager behandlingstid: 15429
Antall dager behandlingstid over 100: 1077115<jupyter_text>Fordleingen er høyere skjev med en veldig lang hale. I dette tilfellet, velges antall behandlingsdager over 100 bort, selv om antallet er betydelig stort. Men, dette må gjøres grundigere når dataen skal analyseres for modelleringen.<jupyter_code>df = df[df<=100]
plt.figure(figsize=(20, 10))
plt.hist(df, bins=100)
plt.grid()
plt.xlabel('antall dager')
plt.ylabel('Antall')
plt.title('Fordelingen av antall behandlingsdager (kun < 100)')
len(df)
plt.figure(figsize=(20, 10))
plt.hist(df[-100000:], bins=100)
plt.grid()
plt.xlabel('antall dager')
plt.ylabel('Antall')
plt.title('Fordelingen av antall behandlingsdager (kun < 100)')
df = df[-100000:]
len(df)<jupyter_output><empty_output><jupyter_text>ModelleringPoisson fordeling virker som et naturlig valg da dette er diskret fordeling som uttrykker antall behandlinger per et gitt tidsintervall (1-dag) Prior Antar at fordelingen er Poisson. ParameterePoisson fordeling tar kun en parameter $\lambda \in (0, \inf)$ LikelihoodPoisson fordelingen kan uttrykkes som en funksjon:$$f(k;\lambda) = Pr(X=k)  = \frac{\lambda~{k}e~{-\lambda}}{k!}$$<jupyter_code>with pm.Model() as modell:
    # definere priors
    prior_lambda = pm.Uniform('lambda_prior', 0, 20)

    # definere likelihood
    behandlingstid_obs = pm.Poisson('Behandlingstid_obs', mu=prior_lambda, observed=df)

    # inference
    # trace = pm.sample(2000,cores = 1,chains = 1,tune = 1000)
    # pm.traceplot(trace)
    # plt.show()
    """
    start = pm.find_MAP()
    step = pm.Slice()
    trace = pm.sample(niter, step, start, random_seed=123, progressbar=True)
    """
    
with modell:
    post = pm.sample(500, target_accept=0.95)
pm.traceplot(post)
az.plot_trace(post)
az.summary(post, round_to=2)
n/np.sum(n)
from scipy.stats import poisson

fig, ax = plt.subplots(figsize=(20,10))
y = poisson.pmf(bins, mu=8)
ax.plot(bins, y*7*10000, label='obeservasjoner')
ax.hist(df[-100000:], bins=100, label='$\lambda=8$')
ax.legend()
ax.set_title('Fordeling tilpasset obeservasjoner')
ax.set_xlabel('Antall dager')
ax.set_ylabel('Antall observasjoner');<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11258776328986961, 'fraction_numerical': 0.02958876629889669, 'mean_word_length': 5.889464594127807, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '141098', 'license': 'Apache-2.0', 'n_tokens_mistral': 1630, 'n_tokens_neox': 1478, 'n_words': 397, 'path': 'BayesianInference.ipynb', 'repo_name': 'Michahom/pysc2', 'size': '3988'}