<jupyter_start><jupyter_text>La suposición de noramlidad es importante para muchos modelos-- Examinar con parcelas:    - qqplots    - diagrama de caja- Prueba con estadísticas:    - La prueba de Shapiro-Wilk;    - La prueba de Anderson-Darling y;    - La prueba de Kolmogorov-Smirnov.  Prueba  Kolmogorov-Smirnov La prueba de KS utilizó CDF observadas / empíricas para las comparaciones: **- Utiliza CDF para comparar datos con:    - una distribución normal ideal para una prueba KS de una muestra    - u otra población para una prueba KS de dos muestras.- Similar a la prueba t pero es sensible a cambios en la media, varianza y forma de los datos.    - ** Función de distribución empírica: **    - Si X es una variable aleatoria con CDF $ F (x) = P (X≤x) $       y $ x1,…, xn $ son i.i.d. Variables aleatorias muestreadas a partir de la función de distribución empírica X.$$\hat{F}(x) = \frac{\text{ of elements in sample} \leq x}{n} = \frac{1}{n} \Sigma_{i=1}^n I(x_i \leq x) \tag{1}$$ Prueba KS de una muestra- Debe proporcionar una función de distribución teórica completamente especificada- Sensible a la media, la varianza, la forma.- Se utiliza para probar el supuesto de normalidad.$$d = max (abs [F_0 (X) -F_r (X)])$$dónde- ** d ** es la desviación máxima del estadístico de Kolmogorov- ** F  0  (X) ** = (No de observaciones ≤ X) / (No total de observaciones) es decir, la distribución empírica no paramétrica- ** F  r  (X) ** = La distribución de frecuencia teórica de X - paramétrica (por ejemplo, basada en el valor medio)<jupyter_code>from scipy.stats import norm
from scipy.special import kolmogorov
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


# Set style
plt.style.use('ggplot')

# Start with shaprio

# mean = loc, scale = sd, size = n
x_10 = stats.norm.rvs(loc=5, scale=3, size=10)
x_50 = stats.norm.rvs(loc=5, scale=3, size=50)
x_100 = stats.norm.rvs(loc=5, scale=3, size=100)
x_1000 = stats.norm.rvs(loc=5, scale=3, size=1000)

def four_plots():
    plt.subplot(2, 2, 1)
    plt.hist(x_10)
    plt.title('Histogram for: x_10')
    plt.subplot(2, 2, 2)
    plt.hist(x_50)
    plt.title('Histogram for: x_50')
    plt.subplot(2, 2, 3)
    plt.hist(x_100)
    plt.title('Histogram for: x_100')
    plt.subplot(2, 2, 4)
    plt.hist(x_1000)
    plt.title('Histogram for: x_1000')
    plt.suptitle('Randomly Sampled Normal Variables: x_N', fontsize=14)
    plt.show()
    

plt.figure(figsize=(18,10))
four_plots()

# Perform test
print(stats.shapiro(x_10))

def accept_reject(shaprio):
    if shaprio[1] > .05 :
        print("Don't reject normality hypothesis")
    else:
        print("Reject normality hypothesis")

print("For x_10: ", accept_reject(stats.shapiro(x_10)))
print( "For x_50: ",  accept_reject(stats.shapiro(x_50)))
print ("For x_100: ",  accept_reject(stats.shapiro(x_100)))
print ("For x_1000: ",  accept_reject(stats.shapiro(x_1000)))
# Create a bimodal dataset
N = 10000
x_bimodal = np.concatenate((np.random.normal(-1, 1, int(0.1 * N)),
                    np.random.normal(5, 1, int(0.4 * N))))

# Plot the bimodal data
plt.figure(figsize=(12, 7))
res = plt.hist(x_bimodal, bins=100)
plt.title("Histogram of a Bimodal Distrubtion")


import statsmodels.api as sm

# QQ Plots for the bimodal data
sm.qqplot(x_bimodal, line='s')



X=x_bimodal
print(stats.kstest(X, 'norm'))
X=(x_bimodal-np.mean(x_bimodal))/np.mean(x_bimodal)
# Get CDF for X, this may not be the most effective or elegant way to do this:
percentiles = np.arange(0,1,(1.0-0.0)/len(X))*100.0
CDF_X=[]; Values=[]
for percentile in percentiles:
    Values.append(np.percentile(X,percentile))
    CDF_X.append(percentile/100.0)
CDF_X=np.array(CDF_X)
Values=np.array(Values)


# CDF for a normal distribution, using the same points as for X
rv = norm()
CDF_A = rv.cdf(Values)

# Get the maximum distance between the two distributions:
KS_statistic = (CDF_X - CDF_A).max()
# Get the index for the max. between the two distributions, for plotting
KS_index = (CDF_X - CDF_A).argmax()

# Get the pvalue from the corresonding scipy function:
# https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.special.kolmogorov.html
pvalue=kolmogorov(np.sqrt(len(X))*KS_statistic)
print("KS statistic = {}".format(KS_statistic))
print("pvalue = {}".format(pvalue))
X=x_100 
# Get CDF for X, this may not be the most effective or elegant way to do this:
percentiles = np.arange(0,1,(1.0-0.0)/len(X))*100.0
CDF_X=[]; Values=[]
for percentile in percentiles:
    Values.append(np.percentile(X,percentile))
    CDF_X.append(percentile/100.0)
CDF_X=np.array(CDF_X)
Values=np.array(Values)


# CDF for a normal distribution, using the same points as for X
rv = norm()
CDF_A = rv.cdf(Values)

# Get the maximum distance between the two distributions:
KS_statistic = (CDF_X - CDF_A).max()
# Get the index for the max. between the two distributions, for plotting
KS_index = (CDF_X - CDF_A).argmax()

# Get the pvalue from the corresonding scipy function:
# https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.special.kolmogorov.html
pvalue=kolmogorov(np.sqrt(len(X))*KS_statistic)
print("KS statistic = {}".format(KS_statistic))
print("pvalue = {}".format(pvalue))<jupyter_output>KS statistic = -1.8263610538361099e-09
pvalue = 1.0<jupyter_text>Prueba KS de dos muestras- comprueba si se han extraído dos muestras ** independientes ** de la misma población o, de forma equivalente, de dos poblaciones idénticas ($X = Y$).- compara dos distribuciones de ** muestra ** (en lugar de teóricas)$$ d = max [abs [{F_ {n1} (X) -F_ {n2} (X)}]] $$- $ n_1 $ = Observaciones de la primera muestra.- $ n_2 $ = Observaciones del segundo muestreo Interpretación de d estadísticas- Cuando el CDF muestra una gran desviación máxima, d refleja la diferencia entre las dos distribuciones de la muestra.    - Valor crítico de d para muestras donde n1 = n2 y es ≤ 40, se utiliza la tabla K-S para el caso de dos muestras.    - Cuando n1 y / o n2> 40, se debe utilizar la tabla K-S para muestras grandes de prueba de dos muestras.- Se acepta la hipótesis nula si el valor calculado es menor que el valor de la tabla y viceversa.<jupyter_code>from scipy import stats

np.random.seed(12345678)  #fix random seed to get the same result
n1 = 200  # size of first sample
n2 = 300  # size of second sample
n3 = 100  # size of second sample


rvs1 = stats.norm.rvs(size=n1, loc=0., scale=1)

rvs2 = stats.norm.rvs(size=n2, loc=0.5, scale=1.5)

rvs3 = stats.norm.rvs(size=n3,  loc=0., scale=1)

stats.ks_2samp(rvs1, rvs2)
stats.ks_2samp(rvs1, rvs3 )<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12334801762114538, 'fraction_numerical': 0.03554610360018229, 'mean_word_length': 4.176100628930818, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 10, 'https://': 2, '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': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '543549', 'license': 'MIT', 'n_tokens_mistral': 2670, 'n_tokens_neox': 2491, 'n_words': 746, 'path': 'PruebadeHipotesis.ipynb', 'repo_name': 'deltareflo/cursoSociedadCientifica', 'size': '6583'}