<jupyter_start><jupyter_text>__Conceptos de estadística e introducción al análisis estadístico de datos usando Python__<jupyter_code>#Importa las paqueterías necesarias 
import numpy as np
import matplotlib.pyplot as pit
import pandas as pd 
import seaborn as sns
import pandas_profiling as pp
from joblib import load, dump
import statsmodels.api as sm<jupyter_output><empty_output><jupyter_text>Para este ejemplo ocuparemos bases de datos abiertas de crimen, registrados en Estados Unidos, específicamente una submuestra de la base de datos de crimen en Nueva York.<jupyter_code>#Usar pandas para leer los datos y guardarlos como data frame
df_NY = load( "./datos_NY_crimen_limpios.pkl")

#Revisar si los datos fueron leidos correctamente
df_NY.head()<jupyter_output><empty_output><jupyter_text>Diccionario de variables de la base de datos de crimenes en NY.    1. Ciudad: lugar en el que ocurrio el incidente    2. Fecha: año, mes y día en el que ocurrio el incidente    3. Hora: hora en la que ocurrio el incidente    4. Estatus: indicador de si el incidente fue completado o no     5. Gravedad: nivel del incidente; violación, delito mayor, delito menor     6. Lugar: lugar de ocurrencia del incidente; dentro, detras de, enfrente a y opuesto a...    7. Lugar especifico: lugar específico dónde ocurrio el incidente; tienda, casa habitación...    8. Crimen_tipo: descripción del tipo de delito     9. Edad_sospechoso: grupo de edad del sospechoso    10. Raza_sospechoso: raza del sospechoso     11. Sexo_sospechoso: sexo del sospechoso; M hombre, F mujer, U desconocido    12. Edad_victima: grupo de edad de la victima     13. Raza_victima: raza a la que pertenece la víctima    14. Sexo_victima: sexo de la victima; M hombre, F mujer, U desconocido                   1.0 __Estadística descriptiva__   1.1 Conceptos de estadística descriptiva: **Población**: conjunto de todos los elementos de interés (N). **Parámetros**: métricas que obtenemos al trabajar con una población.**Muestra**:  subgrupo de la población (n). **Estadísticos**: métricas que obtenemos al trabajar con poblaciones.  ![Python Packages](https://www.cliffsnotes.com/assets/267169.png)  1.2 Una muestra debe ser:     **Representativa**: una muestra representativa es un subgrupo de la poblaciòn que refleja exactamente a los miembros de toda la población.  **Tomada al azar**: una muestra azarosa es recolectada cuando  cada miembro de la muestra es elegida de la población estrictamente por casualidad*¿Cómo sabemos que una muestra es representativa?¿Cómo calculamos el tamaño de muestra?*Depende de los siguientes factores:     1. **Nivel de confianza**: ¿qué necesitamos para estar seguros de que nuestros resultados no ocurrieron solo por azar? Tipicamente se utiliza un nivel de confianza del _95% al 99%_      2. **Porcentaje de diferencia que deseemos detectar**: entre más pequeña sea la diferencia que quieres detectar, más grande debe ser la muestra     3. **Valor absoluto de las probabilidades en las que desea detectar diferencias**: depende de la prueba con la que estamos trabajando. Por ejemplo, detectar una diferencia entre 50% y 51% requiere un tamaño de muestra diferente que detectar una diferencia entre 80% y 81%. Es decir que, el tamaño de muestra requerido es una función de N1.     4. **La distribución de los datos (principalmente del resultado)**  1.3 ¿Qué es una variable?**Variable**: es una característica, número o cantidad que puede ser descrita, medida o cuantíficada. __Tipos de variables__:        1. Cualitativas o catégoricas: ordinales y nominales     2. Cuantitativas o numericas: discretas y continuas<jupyter_code>#ORDINALES
#![variable_catégorica_ordinal](https://www.questionpro.com/blog/wp-content/uploads/2018/06/Liker-Scale-Example_4.jpg)
 #NOMINALES
#![variable_categorica_nominal](https://i.pinimg.com/originals/30/89/c5/3089c56777a8f68e97c29c4d678644a6.jpg)
#DISCRETAS
#![variable_numerica_discreta](https://image.freepik.com/vector-gratis/caracter-hombre-diferentes-edades_61103-88.jpg)
#CONTINUA
#![variable_numerica_continua](https://concepto.de/wp-content/uploads/2013/05/peso.jpg)<jupyter_output><empty_output><jupyter_text>Variables de nuestra base de datos<jupyter_code>df_NY.columns<jupyter_output><empty_output><jupyter_text>1.4 ¿Cómo representar correctamente los diferentes tipos de variables?__Datos categóricos:__ gráfica de barras, pastel, diagrama de pareto (tienen ambas barras y porcentajes)    __Datos numéricos:__ histograma y scatterplot  1.5 Atributos de las variables: medidas de tendencia central  Medidas de tendencia central: __media, mediana y moda__1. **Media**: es la más común y la podemos obtener sumando todos los elementos de una variable y dividiéndola por el número de ellos. Es afectada por valores extremos    2. **Mediana**: número de la posición central de las observaciones (en orden ascendente). No es afectada por valores extremos.     3. **Moda**: el dato más común (puede existir más de una moda). ![tendencia_central](http://andromeda.estadistica.unam.mx/tutorial_estadistica/Est_Indic_SHCP/recursos/imgpp07u1t04.png)  1.6 Atributos de las variables: medidas de asimetría (sesgo) o dispersión __Sesgo__: indica si los datos se concentran en un lado de la curva    Por ejemplo:                 1) cuando la medias es > que la mediana los datos se concentran del lado izquierdo de la curva, es decir que los outlier se encuentra del lado derecho de la distribución.         2) cuando la mediana < que la media, la mayor parte de los datos se concentran del lado derecho de la distribución y los outliers se encuentran en el lado izquierdo de la distribución.         En ambos casos la moda es la medida con mayor representación.__Sin sesgo__: cuando la mediana, la moda y la media son iguales, la distribución es simétrica.    __El sesgo nos habla de donde se encuentran nuestros datos!__  1.7 Varianza La __varianza__ es una medida de dispersión de un grupo de datos alrededor de la media.Una forma más fácil de “visualizar” la varianza es por medio de la __desviación estandar__, en la mayoría de los casos esta es más significativa. El __coeficiente de variación__ es igual a la desviación estándar dividida por el promedioLa desviación estandar es la medida más común de variabilidad para una base de datos única. Una de las principales ventajas de usar desviación estandar es que las unidades no estan elevadas al cuadrado y son más facil de interpretar     1.8  Relación entre variables __Covarianza y Coeficiente de correlación lineal__La covarianza puede ser >0, =0 o <0:1. >0 las dos variables se mueven juntas2. <0 las dos variables se mueven en direcciones opuestas3. =0 las dos variables son independientes El coeficiente de correlación va de -1 a 1  __Para explorar los atributos de cada una de las variables dentro de nuestra base de datos podemos hacer un profile report (podemos resolver toda la estadística descrptiva con un solo comando!!). Este reporte es el resultado de un análisis de cada una de las variables que integran la base de datos. Por medio de este, podemos verificar a que tipo de dato pertenece cada variable y obtener las medidas de tendencia central y asímetria. Con el fin de tener una idea general del comportamiento de nuestras variables. Además, el profile report arroja un análisis de correlación entre variables (ver más adelante), que nos indica que tan relacionadas están entre si dos pares de variables__.<jupyter_code>#pp.ProfileReport(df_NY[['Ciudad', 'Fecha', 'Hora', 'Estatus', 'Gravedad', 'Lugar','Crimen_tipo', 'Lugar_especifico', 'Edad_sospechoso', 'Raza_sospechoso','Sexo_sospechoso', 'Edad_victima', 'Raza_victima', 'Sexo_victima']])<jupyter_output><empty_output><jupyter_text>__2.0  Estadística inferencial__   2.1 Distribuciónes de probabilidad  Una __distribución__ es una función que muestra los valores posibles de una variable y que tan frecuentemente ocurren. Es decir la __frecuencia__ en la que los posibles valores de una variable ocurren en un intervalo.Las distribución más famosa en estadística(no precisamente la más común)es la __distribución normal__, donde la media moda y mediana son =. Es decir no hay sesgoFrecuentemente, cuando los valores de una variable no tienen una distribución normal se recurre a transformaciones o estandarizaciones.   2.2 Regresión lineal  Una __regresión lineal__ es un modelo matemático para aproximar la relación de dependencia entre dos variables, una variable independiente y otra dependiente.*Los valores de las variables dependientes dependen de los valores de las variables independientes*  2.3 Análisis de varianza __Analisis de Varianza (ANOVA)__ se utiliza para comparar los promedios de dos o más grupos. Una prueba de ANOVA puede indicarte si hay diferencia en el promedio entre los grupos. Sin embargo,no nos da información sobre dónde se encuentra la diferencia (entre cuál y cuál grupo). Para resolver esto, podemos realizar una prueba post-hoc.     __Análisis de base de datos abierta de delitos en NY__    1.0 Evaluar frecuencia de delitos  Podemos empezar por análizar los tipos de crimenes registrados, así como frecuencia de cada tipo de crimen.<jupyter_code>#Usar value_counts en Pandas para cuantificar y organizar el tipo de crimenes

df_NY.Crimen_tipo.value_counts().iloc[:10]
df_NY.Crimen_tipo.value_counts().iloc[:10]<jupyter_output><empty_output><jupyter_text>Ahora vamos a crear una grafica de los resultados para tener una mejor visualización de los datos.<jupyter_code>df_NY.Crimen_tipo.value_counts().iloc[:10].plot(kind= "barh")<jupyter_output><empty_output><jupyter_text>Podemos observar que los crimenes con mayor ocurrencia son  "Petit larceny" y "Harraament 2"  1.1 Evaluar frecuencia de un delito específico: por ejemplo "Harrassment"<jupyter_code>df_NY.dropna(inplace=True)
acoso = df_NY[df_NY["Crimen_tipo"].str.contains("HARRASSMENT 2")]
acoso.head(5)<jupyter_output><empty_output><jupyter_text>2.0 Relaciones entre dos variables dependiente e independiente (de manera visual).   2.1 Análisis de la ocurrencia del __delito__ por __sitio__  ¿Existen diferencias en la frecuencia de acoso en las diferentes localidades en NY? Es decir, qué lugares son más peligrosos. En este ejemplo, la variable dependiente sería la ocurrecia del delito y la indenpendiente el sitio. Para ello, usaremos la función __"groupby"__ de Pandas para agrupar por el tipo de localidades, y la función __size__ para revisar el número registrado en cada localidad.<jupyter_code>acoso.columns
acoso.head()
acoso.groupby("Ciudad").size().sort_values(ascending=False)
acoso.Ciudad.value_counts().iloc[:10].plot(kind= "barh")<jupyter_output><empty_output><jupyter_text>Al observar los resultados podemos distinguir en cuál de las localidades de NY hay mayores reportes de acoso. Brooklyn presenta más reportes de acoso.<jupyter_code>acoso.Lugar_especifico.value_counts().iloc[:10].plot(kind= "barh")<jupyter_output><empty_output><jupyter_text>El acoso ocurrió con mayor frecuencia dentro de casas y lugares de residencia.     2.2. Análisis de la ocurrencia del delito en el tiempo Si queremos saber la frecuencia de ocurrencia del delito en diferentes años (2004-2018) y meses del año.Aquí la variable dependiente es nuevamente la ocurrencia del delito y la independiente el tiempo.<jupyter_code>acoso.groupby("anio").size().plot(kind="bar")<jupyter_output><empty_output><jupyter_text>Podemos observar la mayoria de los resportes de acoso ocurrieron del 2016 al 2018. El 2011 fue el año con menor número de reportes de la ocurrencia de acoso   2.3. Analisis de ocurrencia del delito por sexo de la víctima y del agresor  En este ejemplo, la variable dependiente es el sexo de la víctima y la independiente el sexo del agresor   VICTIMAS<jupyter_code>acoso.groupby("Sexo_victima").size().sort_values(ascending=False)
acoso.Sexo_victima.value_counts().iloc[:10].plot(kind= "pie")
acoso.groupby("Edad_victima").size().sort_values(ascending=False)
acoso.Edad_victima.value_counts().iloc[:10].plot(kind= "pie")<jupyter_output><empty_output><jupyter_text>SOSPECHOSOS<jupyter_code>acoso.groupby("Sexo_sospechoso").size().sort_values(ascending=False)
acoso.Sexo_sospechoso.value_counts().iloc[:10].plot(kind= "pie")
acoso.groupby("Edad_sospechoso").size().sort_values(ascending=False)
acoso.Edad_sospechoso.value_counts().iloc[:10].plot(kind= "pie")<jupyter_output><empty_output><jupyter_text>2.4. Analisis de ocurrencia del delito por raza de la víctima y del agresor  En este ultimo ejemplo de relación entre variables, la variable dependiente es la raza de la víctima y la independiente es la raza del agresor.   VICTIMAS<jupyter_code>acoso.groupby("Raza_victima").size().sort_values(ascending=False)
acoso.Raza_victima.value_counts().iloc[:10].plot(kind= "pie")<jupyter_output><empty_output><jupyter_text>SOSPECHOSOS<jupyter_code>acoso.groupby("Raza_sospechoso").size().sort_values(ascending=False)
acoso.Raza_sospechoso.value_counts().iloc[:10].plot(kind= "pie")<jupyter_output><empty_output><jupyter_text>3.0 Regresión lineal  Pongamos a prueba la relación entre un par de variables. Por ejemplo, pero de la victima y peso del agresor. La relación puede ser negativa o positiva.<jupyter_code>import pandas as pd
import statsmodels.api as sm
from sklearn import datasets, linear_model
df_w = pd.read_csv('Weight.csv')
df_w.head()
model = sm.OLS(y,X).fit()
predictions = model.predict(X)

print_model = model.summary()
print(print_model)
from scipy.stats import shapiro
stat, p = shapiro (y)
print('statistics=%.3f, p=%.3f' % (stat, p))
alpha = 0.05
if p > alpha:
    print('its Gaussian')
else:
    print('not Gaussian')
import statsmodels.api as sm
import pylab
sm.qqplot(y, loc = 4, scale = 3, line = 's')
pylab.show()
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(color_codes = True)

sns.regplot(x = "AGRE_Weight ", y = "VIC_Weight", data = tamano);<jupyter_output><empty_output><jupyter_text>4.0 ANOVA Para realizar un análisis de variaza utilizando nuestros datos inicialmente debemos plantearnos una hipótesis. Por ejemplo: Existe diferencias en la edad de las víctimas entre los sitios donde ocurre ocoso.Podemos probar nuetra hipótesis de manera estadística. En este caso generaremos una columna extra de datos numericos continuos aproximados de "Edad_calculada_victima" y "Edad_calculada_agresor" para hacer el análisis<jupyter_code>import pandas as pd
import scipy.stats as stats

import statsmodels. api as sm
from statsmodels.formula.api import ols

acoso["Edad_sospechoso"].unique()

from random import randint

def rango_a_random(s):
    if type(s)==str:
        s = s.split('-')
        s = [int(i) for i in s]
        s = randint(s[0],s[1]+1)
    return s

acoso["Edad_calculada_victima"] = acoso["Edad_victima"]
acoso["Edad_calculada_victima"] = acoso["Edad_calculada_victima"].replace("65+","65-90").replace("<18","15-18").replace("UNKNOWN",np.nan)
acoso["Edad_calculada_victima"] = acoso["Edad_calculada_victima"].apply(rango_a_random)

acoso["Edad_calculada_sospechoso"] = acoso["Edad_sospechoso"]
acoso["Edad_calculada_sospechoso"] = acoso["Edad_calculada_sospechoso"].replace("65+","65-90").replace("<18","15-18").replace("UNKNOWN",np.nan)
acoso["Edad_calculada_sospechoso"] = acoso["Edad_calculada_sospechoso"].apply(rango_a_random)
acoso.head(5)
acoso.dropna ()
results = ols('Edad_calculada_victima ~ C(Ciudad)', data = acoso).fit()
results.summary()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07713266299059358, 'fraction_numerical': 0.01543950697372689, 'mean_word_length': 5.548853016142735, 'pattern_counts': {'":': 0, '<': 74, '<?xml version=': 0, '>': 73, 'https://': 5, 'lorem ipsum': 0, 'www.': 2, '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': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '14047', 'license': 'MIT', 'n_tokens_mistral': 5380, 'n_tokens_neox': 5253, 'n_words': 1769, 'path': 'extras/Python and statistics .ipynb', 'repo_name': 'mar-esther23/CursoPandas2020', 'size': '15415'}