¿Cómo encontrar la distribución de probabilidad y los parámetros para datos reales? (Python 3)

Tengo un conjunto de datos de sklearn y sklearn la distribución de los datos de load_diabetes.target (es decir, los valores de la regresión que se utilizan para load_diabetes.data ).

Utilicé esto porque tiene el menor número de variables / atributos de la regresión sklearn.datasets .

Utilizando Python 3, ¿cómo puedo obtener el tipo de distribución y los parámetros de la distribución que más se asemejan?

Todo lo que sé, los valores target son todos positivos y sesgados (sesgo positivo / sesgo correcto). . . ¿Hay alguna manera en Python de proporcionar algunas distribuciones y luego obtener la mejor opción para el vector / datos de target ? O, ¿para realmente sugerir un ajuste basado en los datos que se dan? Eso sería realmente útil para las personas que tienen conocimientos estadísticos teóricos pero poca experiencia en la aplicación de “datos reales”.

Bonificación ¿Tendría sentido utilizar este tipo de enfoque para averiguar cuál sería su distribución posterior con “datos reales”? Si no, ¿por qué no?

 from sklearn.datasets import load_diabetes import matplotlib.pyplot as plt import seaborn as sns; sns.set() import pandas as pd #Get Data data = load_diabetes() X, y_ = data.data, data.target #Organize Data SR_y = pd.Series(y_, name="y_ (Target Vector Distribution)") #Plot Data fig, ax = plt.subplots() sns.distplot(SR_y, bins=25, color="g", ax=ax) plt.show() 

introduzca la descripción de la imagen aquí

Según mi conocimiento, no existe una forma automática de obtener el tipo de distribución y los parámetros de una muestra (ya que inferir la distribución de una muestra es un problema estadístico en sí mismo).

En mi opinión, lo mejor que puedes hacer es:

(para cada atributo)

  • Intente ajustar cada atributo a una lista razonablemente grande de posibles distribuciones (p. Ej., Ver Ajustar la distribución empírica a las teóricas con Scipy (Python)? Para ver un ejemplo con Scipy)

  • Evalúa todos tus ajustes y elige el mejor. Esto se puede hacer realizando una prueba de Kolmogorov-Smirnov entre su muestra y cada una de las distribuciones del ajuste (nuevamente tiene una implementación en Scipy), y seleccionando la que minimiza D, el estadístico de prueba (también conocida como la diferencia entre muestra y el ajuste).

Bonificación: Tendría sentido, ya que construirá un modelo en cada una de las variables a medida que elija un ajuste para cada una, aunque la bondad de su predicción dependerá de la calidad de sus datos y las distribuciones que esté utilizando para adecuado. Estás construyendo un modelo, después de todo.

Puede usar ese código para ajustar (según la probabilidad máxima) diferentes distribuciones con sus datos:

 import matplotlib.pyplot as plt import scipy import scipy.stats dist_names = ['gamma', 'beta', 'rayleigh', 'norm', 'pareto'] for dist_name in dist_names: dist = getattr(scipy.stats, dist_name) param = dist.fit(y) # here's the parameters of your distribution, scale, location 

Puede ver un fragmento de muestra sobre cómo usar los parámetros obtenidos aquí: ¿ Ajustar la distribución empírica a los teóricos con Scipy (Python)?

Luego, puede elegir la distribución con la mejor probabilidad de registro (también hay otros criterios para coincidir con la “mejor” distribución, como la probabilidad posterior bayesiana, los valores AIC, BIC o BICc, …).

Para tu pregunta extra, no hay una respuesta genérica. Si su conjunto de datos es significativo y se obtiene en las mismas condiciones que los datos de la palabra real, puede hacerlo.

Usa este enfoque

 import scipy.stats as st def get_best_distribution(data): dist_names = ["norm", "exponweib", "weibull_max", "weibull_min", "pareto", "genextreme"] dist_results = [] params = {} for dist_name in dist_names: dist = getattr(st, dist_name) param = dist.fit(data) params[dist_name] = param # Applying the Kolmogorov-Smirnov test D, p = st.kstest(data, dist_name, args=param) print("p value for "+dist_name+" = "+str(p)) dist_results.append((dist_name, p)) # select the best fitted distribution best_dist, best_p = (max(dist_results, key=lambda item: item[1])) # store the name of the best fit and its p value print("Best fitting distribution: "+str(best_dist)) print("Best p value: "+ str(best_p)) print("Parameters for the best fit: "+ str(params[best_dist])) return best_dist, best_p, params[best_dist]