Edgar Anderson coleccionó los datos para cuantificar la variación morfológica de la flor Iris de tres especies relacionadas.La muestra es de 50, cada una de tres especies de Iris (Iris setosa, Iris virginica e Iris versicolor). Las variable son
Sepal-length = Largo de Sépalo
Sepal-width = Ancho de Sépalo
Petal-length = Largo del Pétalo
Petal-with = Ancho del Pétalo
Class = Clase de iris
# Conjunto de datos Iris
import pandas as pd
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
data1 = pd.read_csv(url, names=names)## sepal-length sepal-width ... petal-width class
## 0 5.1 3.5 ... 0.2 Iris-setosa
## 1 4.9 3.0 ... 0.2 Iris-setosa
## 2 4.7 3.2 ... 0.2 Iris-setosa
## 3 4.6 3.1 ... 0.2 Iris-setosa
## 4 5.0 3.6 ... 0.2 Iris-setosa
##
## [5 rows x 5 columns]
# Conjunto de datos Iris
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
names = c('sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class')
data1 = read.csv(url,header = F,col.names=names)## sepal-length sepal-width petal-length petal-width class
## 1 5.1 3.5 1.4 0.2 Iris-setosa
## 2 4.9 3.0 1.4 0.2 Iris-setosa
## 3 4.7 3.2 1.3 0.2 Iris-setosa
## 4 4.6 3.1 1.5 0.2 Iris-setosa
## 5 5.0 3.6 1.4 0.2 Iris-setosa
## 6 5.4 3.9 1.7 0.4 Iris-setosa
Variables: survived=sobrevivencia 0=no 1=si
Pclass= calse de ticket 1=primera 2=segunda 3=tercera
male : masculino 1 o no
age :edad
sibsp: # de hermanos /conyuges abordo
Hermano = hermano, hermana, hermanastro, hermanastra
Cónyuge = esposo, esposa (las amantes y los novios fueron ignorados)
parch: # de padres
Padre = madre, padre
Hijo = hija, hijo, hijastra, hijastro
Algunos niños viajaron solo con una niñera, por lo tanto parch = 0 para ellos.
fare : tarifa del pasajero
embarked_c : embarco en Cherbourg
embarked_s embarco en Southampton
embarked_q embarco en Queenstown
cant_flia :
import pandas as pd
data2 = pd.read_csv('https://www.dropbox.com/s/cugxdc9mhau4nw1/titanic2.csv?dl=1')
data2.head()## pclass male age ... embarked_s embarked_q survived
## 0 3 1 22.0 ... 1 0 0
## 1 3 1 18.0 ... 1 0 0
## 2 1 0 38.0 ... 0 0 1
## 3 2 1 28.0 ... 1 0 0
## 4 2 0 34.0 ... 1 0 1
##
## [5 rows x 12 columns]
## 0 524
## 1 110
## 2 68
## 5 5
## 3 5
## 4 4
## 6 1
## Name: parch, dtype: int64
## count 717.000000
## mean 0.634589
## std 0.481882
## min 0.000000
## 25% 0.000000
## 50% 1.000000
## 75% 1.000000
## max 1.000000
## Name: male, dtype: float64
## pclass male ... embarked_q survived
## count 717.000000 717.000000 ... 717.000000 717.000000
## mean 2.235704 0.634589 ... 0.040446 0.405858
## std 0.838299 0.481882 ... 0.197141 0.491400
## min 1.000000 0.000000 ... 0.000000 0.000000
## 25% 1.000000 0.000000 ... 0.000000 0.000000
##
## [5 rows x 12 columns]
## pclass 1603.0000
## male 455.0000
## age 21318.1700
## sibsp 367.0000
## parch 308.0000
## fare 24852.0247
## cant_flia 1659.0000
## frecuencia 16517.0000
## embarked_c 131.0000
## embarked_s 555.0000
## embarked_q 29.0000
## survived 291.0000
## dtype: float64
## 0 280.2500
## 1 275.3000
## 2 115.2833
## 3 70.0000
## 4 64.0000
## dtype: float64
## pclass male age ... embarked_s embarked_q survived
## 0 3.0 1.0 22.0 ... 1.0 0.0 0.0
## 1 6.0 2.0 40.0 ... 2.0 0.0 0.0
## 2 7.0 2.0 78.0 ... 2.0 0.0 1.0
## 3 9.0 3.0 106.0 ... 3.0 0.0 1.0
## 4 11.0 3.0 140.0 ... 4.0 0.0 2.0
##
## [5 rows x 12 columns]
## pclass male age ... embarked_s embarked_q survived
## 0 3.0 4.0 26.0 ... 280.2500 280.2500 280.2500
## 1 3.0 4.0 22.0 ... 275.3000 275.3000 275.3000
## 2 1.0 1.0 39.0 ... 114.2833 114.2833 115.2833
## 3 2.0 3.0 31.0 ... 70.0000 70.0000 70.0000
## 4 2.0 2.0 36.0 ... 63.0000 63.0000 64.0000
##
## [5 rows x 12 columns]
## pclass male age sibsp parch fare cant_flia frecuencia embarked_c
## 1 3 1 22 1 0 7.2500 2 243 0
## 2 3 1 18 0 0 8.3000 1 243 0
## 3 1 0 38 1 0 71.2833 2 0 1
## 4 2 1 28 0 1 33.0000 4 0 0
## embarked_s embarked_q survived
## 1 1 0 0
## 2 1 0 0
## 3 0 0 1
## 4 1 0 0
##
## 0 1 2 3 4 5 6
## 524 110 68 5 4 5 1
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0000 1.0000 0.6346 1.0000 1.0000
## pclass male age sibsp parch
## Min. :1.0 Min. :0.0 Min. :18 Min. :0.0 Min. :0.0
## 1st Qu.:2.0 1st Qu.:0.0 1st Qu.:22 1st Qu.:0.0 1st Qu.:0.0
## Median :2.0 Median :1.0 Median :28 Median :0.0 Median :0.0
## Mean :2.2 Mean :0.6 Mean :28 Mean :0.4 Mean :0.4
## 3rd Qu.:3.0 3rd Qu.:1.0 3rd Qu.:34 3rd Qu.:1.0 3rd Qu.:1.0
## Max. :3.0 Max. :1.0 Max. :38 Max. :1.0 Max. :1.0
## fare cant_flia frecuencia embarked_c embarked_s
## Min. : 7.25 Min. :1.0 Min. : 0.0 Min. :0.0 Min. :0.0
## 1st Qu.: 8.30 1st Qu.:2.0 1st Qu.: 0.0 1st Qu.:0.0 1st Qu.:1.0
## Median :23.00 Median :2.0 Median : 0.0 Median :0.0 Median :1.0
## Mean :28.57 Mean :2.2 Mean : 97.2 Mean :0.2 Mean :0.8
## 3rd Qu.:33.00 3rd Qu.:2.0 3rd Qu.:243.0 3rd Qu.:0.0 3rd Qu.:1.0
## Max. :71.28 Max. :4.0 Max. :243.0 Max. :1.0 Max. :1.0
## embarked_q survived
## Min. :0 Min. :0.0
## 1st Qu.:0 1st Qu.:0.0
## Median :0 Median :0.0
## Mean :0 Mean :0.4
## 3rd Qu.:0 3rd Qu.:1.0
## Max. :0 Max. :1.0
## pclass male age sibsp parch fare
## 1603.00 455.00 21318.17 367.00 308.00 24852.02
## cant_flia frecuencia embarked_c embarked_s embarked_q survived
## 1659.00 16517.00 131.00 555.00 29.00 291.00
## [1] 280.2500 275.3000 115.2833 70.0000 64.0000
## pclass male age sibsp parch fare cant_flia frecuencia embarked_c
## 1 3 1 22 1 0 7.2500 2 243 0
## 2 6 2 40 1 0 15.5500 3 486 0
## 3 7 2 78 2 0 86.8333 5 486 1
## 4 9 3 106 2 1 119.8333 9 486 1
## 5 11 3 140 2 2 142.8333 11 486 1
## embarked_s embarked_q survived
## 1 1 0 0
## 2 2 0 0
## 3 2 0 1
## 4 3 0 1
## 5 4 0 2
# acumular filas
# No hay una función por defecto en R
#para ir acumulado por columna para cada fila,
#pero igual se puede calcular.
head(data.frame(t(apply(data2,1,cumsum))))## pclass male age sibsp parch fare cant_flia frecuencia embarked_c
## 1 3 4 26 27 27 34.2500 36.2500 279.2500 279.2500
## 2 3 4 22 22 22 30.3000 31.3000 274.3000 274.3000
## 3 1 1 39 40 40 111.2833 113.2833 113.2833 114.2833
## 4 2 3 31 31 32 65.0000 69.0000 69.0000 69.0000
## 5 2 2 36 36 37 60.0000 62.0000 62.0000 62.0000
## embarked_s embarked_q survived
## 1 280.2500 280.2500 280.2500
## 2 275.3000 275.3000 275.3000
## 3 114.2833 114.2833 115.2833
## 4 70.0000 70.0000 70.0000
## 5 63.0000 63.0000 64.0000
Son Estadísticos o valores númericos que muestra el centro de los datos
Sea \(X_1,…,X_n\) elementos de una muestra se define como media aritmética o promedio, \(\overline{X}=\frac{\sum^n_{i=1}}{n}\)
## pclass 2.235704
## male 0.634589
## age 29.732455
## sibsp 0.511855
## parch 0.429568
## fare 34.661122
## cant_flia 2.313808
## frecuencia 23.036262
## embarked_c 0.182706
## embarked_s 0.774059
## embarked_q 0.040446
## survived 0.405858
## dtype: float64
## 0 23.354167
## 1 22.941667
## 2 9.606942
## 3 5.833333
## 4 5.333333
## dtype: float64
## pclass male age sibsp parch fare
## 2.2357043 0.6345886 29.7324547 0.5118550 0.4295676 34.6611223
## cant_flia frecuencia embarked_c embarked_s embarked_q survived
## 2.3138075 23.0362622 0.1827057 0.7740586 0.0404463 0.4058577
## [1] 23.354167 22.941667 9.606942 5.833333 5.333333 5.675000
Es un conjunto de n observaciones ordenadas de forma creciente, donde la mediana es Me se define como el valor central:
n es impar \(Me=X(n+1)/2\)n es par \(Me=(Xn/2+Xn/2+1)/2\)## pclass 2.0000
## male 1.0000
## age 28.0000
## sibsp 0.0000
## parch 0.0000
## fare 15.7417
## cant_flia 2.0000
## frecuencia 0.0000
## embarked_c 0.0000
## embarked_s 1.0000
## embarked_q 0.0000
## survived 0.0000
## dtype: float64
#mediana
#En R esta función está creada para calcular
#la Mediana de una columna, por eso se usa la función apply
#que aplica la función (FUN) median a todas las columna de data2
apply(data2, 2, FUN = median)## pclass male age sibsp parch fare
## 2.0000 1.0000 28.0000 0.0000 0.0000 15.7417
## cant_flia frecuencia embarked_c embarked_s embarked_q survived
## 2.0000 0.0000 0.0000 1.0000 0.0000 0.0000
Es aquel valor que presenta la mayor frecuencia
## pclass male age ... embarked_s embarked_q survived
## 0 3 1 24.0 ... 1 0 0
##
## [1 rows x 12 columns]
## pclass male age ... embarked_s embarked_q survived
## pclass 1.000000 0.158191 -0.371633 ... 0.203768 0.136608 -0.361384
## male 0.158191 1.000000 0.089765 ... 0.116374 -0.020628 -0.540650
## age -0.371633 0.089765 1.000000 ... -0.035556 -0.024746 -0.074051
## sibsp 0.065494 -0.105811 -0.306163 ... 0.021282 0.046977 -0.015153
## parch 0.026210 -0.246483 -0.189782 ... 0.017980 -0.012120 0.093396
##
## [5 rows x 12 columns]
# No hay función nativa para la moda,
#pero se puede construir o utilizar desde otra librería.
library(DescTools)
apply(data2,2,FUN=Mode)## pclass male age sibsp parch fare
## 3 1 24 0 0 13
## cant_flia frecuencia embarked_c embarked_s embarked_q survived
## 1 0 0 1 0 0
## pclass male age sibsp parch
## pclass 1.00000000 0.15819098 -0.37163284 0.06549387 0.02621049
## male 0.15819098 1.00000000 0.08976536 -0.10581104 -0.24648345
## age -0.37163284 0.08976536 1.00000000 -0.30616340 -0.18978215
## sibsp 0.06549387 -0.10581104 -0.30616340 1.00000000 0.38378535
## parch 0.02621049 -0.24648345 -0.18978215 0.38378535 1.00000000
## fare -0.55418870 -0.18637307 0.09697747 0.13923321 0.20523559
## fare cant_flia frecuencia embarked_c embarked_s
## pclass -0.55418870 0.1113725 -0.08493845 -0.279519451 0.20376755
## male -0.18637307 -0.1334792 0.07456707 -0.105914247 0.11637364
## age 0.09697747 -0.2457029 0.12680548 0.041016869 -0.03555555
## sibsp 0.13923321 0.6840369 -0.02165746 -0.042999177 0.02128232
## parch 0.20523559 0.6545208 -0.08732746 -0.009637626 0.01798005
## fare 1.00000000 0.1246749 0.03840734 0.300618835 -0.25280584
## embarked_q survived
## pclass 0.13660765 -0.36138402
## male -0.02062759 -0.54065018
## age -0.02474648 -0.07405105
## sibsp 0.04697691 -0.01515305
## parch -0.01211965 0.09339592
## fare -0.06516895 0.26938956
Rango: es la diferencia entre el calor maximo y minimo de los datos
Cuartiles : La mediana de una distribución divide los datos en dos partes iguales, Cuando se dividen un conjunto ordenado de datos en cuatro partes iguales, los puntos de división se conocen como cuartiles y los representamos por \(Q_1,Q_2\) y \(Q_3\).
Rango Intercuartilico (RI) : . El rango entre cuartiles mide la variabilidad de la mitad central de los datos \(Q_3−Q_1\) .
Percentil : el k-ésimo percentil es un valor tal que el \(k\%\) de los datos son menores o iguales que él, y el \((100−k)\%\) restante son mayores o iguales que él
Desviación estándar: es un promedio de las desviaciones individuales de cada observación con respecto a la media de una distribución.
\[S=\sqrt{\frac{1}{n−1}\sum(xi−x)^2}\]
## pclass 0.838299
## male 0.481882
## age 14.526366
## sibsp 0.928407
## parch 0.851956
## fare 52.831835
## cant_flia 1.884364
## frecuencia 92.682366
## embarked_c 0.386695
## embarked_s 0.418493
## embarked_q 0.197141
## survived 0.491400
## dtype: float64
## pclass 0.702746
## male 0.232210
## age 211.015295
## sibsp 0.861940
## parch 0.725828
## fare 2791.202804
## cant_flia 3.550829
## frecuencia 8590.021030
## embarked_c 0.149533
## embarked_s 0.175136
## embarked_q 0.038865
## survived 0.241474
## dtype: float64
## pclass male age sibsp parch fare
## 0.8382993 0.4818815 14.5263655 0.9284074 0.8519557 52.8318351
## cant_flia frecuencia embarked_c embarked_s embarked_q survived
## 1.8843643 92.6823663 0.3866948 0.4184927 0.1971411 0.4914001
## pclass male age sibsp parch
## 7.027458e-01 2.322098e-01 2.110153e+02 8.619403e-01 7.258284e-01
## fare cant_flia frecuencia embarked_c embarked_s
## 2.791203e+03 3.550829e+00 8.590021e+03 1.495329e-01 1.751362e-01
## embarked_q survived
## 3.886461e-02 2.414740e-01
Es una medida de variación relativa y se define como \[C.V=\frac{S}{\overline{x}}100\]
Es la desviación estándar expresado como porcentaje de la media (promedio), por lo tanto no viene expresado en unidades. Es útil para la comparación de la variabilidad relativa entre distribuciones que no están expresadas en la misma unidad de medida o bien, entre distribuciones que si bien están expresadas en la misma unidad, poseen promedios muy dispares.
Ejercicio: En marzo del año pasado, los datos de préstamos personales de un Banco mostraron un promedio de $6.500.000 y una desviación estándar de $3.000.000 . Recientemente se calculó la media y la desviación estándar correspondiente a los préstamos personales de marzo del presente año resultando las mismas 9.000.000 y 3.500.000 respectivamente. ¿En cuál de los dos años los préstamos personales presentaron menor dispersión relativa?.
Resp. Presente año (39%)
Los valores atipicos (outliers) son valores que se encuntran alegados de los datos
Regla para identificarlo: Se define un valor \(x_i\) como extremo o atipico (outliers) si \(x_i<Q_1−1.5∗(Q_3−Q_1)\) o \(x_i>Q_3+1.5∗(Q_3−Q_1)\)
Ejercicio: Calcule Q1, Q2 , Q3 y su rango intercuartilico de la data2.
#boxplot
#data2
import matplotlib.pyplot as plt
red_square = dict(markerfacecolor='r', marker='s')
fig1, ax1 = plt.subplots()
ax1.set_title('Mi primer Boxplot')
ax1.boxplot(data2.age,flierprops=red_square)# en forma horizontal
red_square = dict(markerfacecolor='r', marker='s')
fig2, ax2 = plt.subplots()
ax2.set_title('Mi primer Boxplot')
ax2.boxplot(data2.age,flierprops=red_square,vert=False)# sin outliers
fig3, ax3 = plt.subplots()
ax3.set_title('Mi primer Boxplot')
ax3.boxplot(data2.age,showfliers=False)#### varios boxplot
plt.ion()
data21=data2['age']
data22=data2['fare']
#fig4, ax4 = plt.subplots()
#ax4.set_title('varios boxplot')
plt.title(u'Titulo a colocar')
plt.boxplot([data21,data22])
plt.xticks([1,2], ['age', 'fare'], size = 'small', color = 'k')
plt.ylabel(u'colocar info')# en forma horizontal
boxplot(data2$age,outcol="red",outpch = 15,medcol="orange", horizontal = T)
title('Mi primer Boxplot')#### varios boxplot
boxplot(data2$age,data2$fare, medcol="orange",names = c("age", "fare"))
title('Titulo a colocar')plt.figure()
plt.ion() # modo interactivo
import numpy as np
# Definimos un vector de números aleatorios de una distribución normal
x = np.random.randn(1000)
# Dibuja un histograma dividiendo el vector x en 20 intervalos del mismo ancho
plt.hist(x, bins = 20)
plt.xlabel('valores aleatorios normales')
plt.ylabel('frecuencia')
plt.title(u'histograma')# Definimos un vector de números aleatorios de una distribución normal
x=rnorm(1000)
# Grafica un histograma dividiendo el vector x en 20 intervalos del mismo ancho
hist(x,bins=20,ylab='frecuencia',xlab='valores aleatorios normales',
main='histograma',col='#1f77b4')plt.figure()
plt.bar(data2['pclass'].unique(),data2['pclass'].value_counts())
plt.xlabel('Clase del pasajero')
plt.ylabel('frecuencia')
plt.title('pasajeros del titanic')# Gráfico de barras de pasajeros del Titanic
plt.figure()
pl = data2['pclass'].value_counts().plot(kind='bar',title='Pasajeros del Titanic')
pl.set(xlabel='Clase del pasajero', ylabel='frecuencia',title='Pasajeros del Titanic')# gráfico con frecuencias relativas
plt.figure()
pl2 = (100 *data2['pclass'].value_counts() / len(data2['pclass'])).plot(kind='bar')
pl2.set(title='Pasajeros del Titanic- Porcentaje', xlabel='Clase del pasajero', ylabel='frecuencia')#data1['class']
plt.figure()
plt.pie(data1['class'].value_counts(),labels=data1['class'].unique())
plt.title('grafico de torta')
#otra forma
#data1['class'].value_counts().plot(kind='pie',title=''grafico de torta')barplot(table(data2$pclass),xlab='Clase del pasajero',
ylab='frecuencia',main='pasajeros del titanic',col='#1f77b4')# Gráfico de barras de pasajeros del Titanic
tabla=sort(table(data2$pclass),decreasing = T)
barplot(tabla,xlab='Clase del pasajero',
ylab='frecuencia',main='pasajeros del titanic',
col=c('#1F77B4','#FF7F0E','#2CA02C'))# gráfico con frecuencias relativas
tabla=sort(100*prop.table(table(data2$pclass)),decreasing = T)
barplot(tabla,xlab='Clase del pasajero',
ylab='frecuencia',main='pasajeros del titanic',
col=c('#1F77B4','#FF7F0E','#2CA02C'))Cualitativas: los valores que toma la variable son cualidades, no numéricas, por ejemplo;
Cuantitativas: Los valores que toma la variable son números,
Usualmente estas tablas se utilizan para medir el grado de asociación entre las variables cualitativas
## pclass 1 2 3 All
## survived
## 0 64 91 271 426
## 1 123 83 85 291
## All 187 174 356 717
# Con porcentaje relativo total
pd.crosstab(index=data2['survived'], columns=data2['pclass'],margins=True).apply(lambda r: r/len(data2) *100,axis=1)## pclass 1 2 3 All
## survived
## 0 8.926081 12.691771 37.796374 59.414226
## 1 17.154812 11.576011 11.854951 40.585774
## All 26.080893 24.267782 49.651325 100.000000
# Con porcentaje relativo segun la clase
pd.crosstab(index=data2['survived'], columns=data2['pclass'],margins=False).apply(lambda r: r/r.sum() *100,axis=0)## pclass 1 2 3
## survived
## 0 34.224599 52.298851 76.123596
## 1 65.775401 47.701149 23.876404
# Con porcentaje relativo segun sobreviviente
pd.crosstab(index=data2['survived'], columns=data2['pclass'],margins=False).apply(lambda r: r/r.sum() *100,axis=1)## pclass 1 2 3
## survived
## 0 15.023474 21.361502 63.615023
## 1 42.268041 28.522337 29.209622
# Tabla de contingencia.
pd.crosstab(index=data2['survived'],columns=data2['embarked_s'], margins=True)## embarked_s 0 1 All
## survived
## 0 72 354 426
## 1 90 201 291
## All 162 555 717
#Cargaré una función externa crosstab
source("http://pcwww.liv.ac.uk/~william/R/crosstab.r")
crosstab(data2,row.vars ='survived',col.vars ='pclass') ## pclass 1 2 3 Sum
## survived
## 0 64 91 271 426
## 1 123 83 85 291
## Sum 187 174 356 717
## pclass 1 2 3 Sum
## survived
## 0 8.93 12.69 37.80 59.41
## 1 17.15 11.58 11.85 40.59
## Sum 26.08 24.27 49.65 100.00
# Con porcentaje relativo segun la clase
crosstab(data2,row.vars ='survived',col.vars ='pclass',type = "c") ## pclass 1 2 3
## survived
## 0 34.22 52.30 76.12
## 1 65.78 47.70 23.88
## Sum 100.00 100.00 100.00
# Con porcentaje relativo segun sobreviviente
crosstab(data2,row.vars ='survived',col.vars ='pclass',type = "r") ## pclass 1 2 3 Sum
## survived
## 0 15.02 21.36 63.62 100.00
## 1 42.27 28.52 29.21 100.00
## embarked_s 0 1 Sum
## survived
## 0 72 354 426
## 1 90 201 291
## Sum 162 555 717
Es una forma alternativa de representar la posibilidad de ocurrencia de un evento de interés. Se define como un cociente entre el número de eventos y el número de “no eventos”, Ejemplo, si el pronóstico del tiempo anuncia que la probabilidad de lluvia durante junio es \(40\%\), entendemos que es posible que llueva en 12/30 días que tiene dicho mes. Una forma alternativa de representar la posibilidad de ocurrencia de un evento de interés es mediante el uso de odds. Por lo tanto el odds de lluvia durante junio es 12/18.
Probabilidades y odds son intercambiables:
\[odds=\frac{prob(Evento)}{1−prob(Evento)}\]
\[prob(Evento)=\frac{odds}{odds+1}\]
A mayor probabilidad, mayor es la diferencia numérica entre ambos.
Es una medida de efecto comúnmente utilizada para comunicar los resultados de una investigación en Medicina, donde es habitual ver esta medida en los estudios de caso y control. Matematicamente es el cuociente entre dos odds (casos investigado vs control)
\[OR=\frac{\mbox{odds exposicion en casos}}{\mbox{odds control}}\]
Luego el \(OR\) se define como \(OR=\frac{a×d}{b×c}\) donde odds exposición en \(casos=\frac{a}{c}\) , y odds control en \(casos=\frac{b}{d}\)
Ejemplo, se realizo una encuesta a 100 paciente en un hospital para determinar si hay o no asociación entre el habito de fumar y el cancer al pulmon.
## tabla
## 50
## 3
EL \(OR=\frac{15×55}{5×25}=\frac{825}{125}=6,6\) (asociación positiva) es decir la razon de tener cancer vs no tener es 6,6 veces mayor en personas que son fumadores en comparación los que no lo son.
En terminos generales
si OR=1 , no existe asociación entre las variables, es decir la cantidad de veces que el evento ocurra va hacer igual con o sin la presencia del factor.
si OR>1 (asociacón positiva) , es decir la presencia del factor se asocia a la mayor ocurrencia del evento (Factor de Riesgo)
si OR<1 (asociacón negativa) , es decir la presencia del factor no se asocia a la mayor ocurrencia del evento (Factor de Factor de Protección)
Lo anterior lo podemos expresar en probabilidades es decir \(Prob=\frac{6,6}{7,6}=0,87\) , lo que implicaría que exoiste un 87% de probabilidad de que el evento(tener cancer o no) este asociado con la presencia del factor (fumar).
Ejercicio.
Se realiza un estudio destinado a valorar el nivel de protección conferido por al vacuna antisarampión utilizando un diseño de estudio de casos y controles. Para ello, se identificaron a 48 niños con el antecedente de sarampión y 48 controles en quienes se indagan por el antecedente de vacunación previa, obteniendo los siguientes resultados
## Sarampión
## Vacunación No Si
## No 2 14
## Si 46 34
¿Que podemos concluir?
Es una medida que indica las veces que tiende a desarrollar el evento en el grupo de sujetos expuestos al factor de exposición o factor de riesgo en relación con el grupo no expuesto.
\[RR=\frac{a/(a+c)}{b/(b+d)}\]
El riesgo de fumar y padecer cancer es el \(15/20 = 75\%\) y el no padecer es el \(25/80 = 31,25\%\); el RR es \(0,75/0,3125 = 2,4\). Esto significa que el riesgo de padecer cancer dado al exposición a fumar es 2,4 veces muerte del grupo no expuesto.
Es un estadístico que mide el grado asociación, relación o dependencia entre dos o mas variables.
% Si nuestro objetivo es ver el grado de linealidad de dos variables (continuas), el estadistico de correlación de Pearson es el adecuado
\[\rho=\frac{COV(X,Y)}{\sigma(X)×\sigma(Y)}\]
Si \(ρ=1\) , existe una correlación positiva perfecta. todos los puntos estan sobre una recta lineal Si \(0<ρ<1\) , existe una correlación positiva. Si \(ρ=0\) , no existe relación lineal. Si \(−1<ρ<0\) , existe una correlación negativa. Si \(ρ=−1\) , existe una correlación negativa perfecta. El índice indica una dependencia total entre las dos variables llamada relación inversa: cuando una de ellas aumenta, la otra disminuye en proporción constante.
Correlación Spearman, al igual que la anterior mide el grado de relación entre dos variables y su intepretacoón es similar, con la salvedad de que sirve para variables discretas y continuas.
\[ρ_{spearman}=1−\frac{6∑D2}{N(N2−1)}\]
donde D es la diferencia entre los correspondientes estadísticos de orden de x - y , N es el número de parejas de datos.
# correlación Pearson
name1=['sepal-length', 'sepal-width', 'petal-length', 'petal-width']
data1[name1].corr(method='pearson', min_periods=1)## sepal-length sepal-width petal-length petal-width
## sepal-length 1.000000 -0.109369 0.871754 0.817954
## sepal-width -0.109369 1.000000 -0.420516 -0.356544
## petal-length 0.871754 -0.420516 1.000000 0.962757
## petal-width 0.817954 -0.356544 0.962757 1.000000
# correlación Pearson
name1=c('sepal-length', 'sepal-width', 'petal-length', 'petal-width')
cor(data1[name1])## sepal-length sepal-width petal-length petal-width
## sepal-length 1.0000000 -0.1093692 0.8717542 0.8179536
## sepal-width -0.1093692 1.0000000 -0.4205161 -0.3565441
## petal-length 0.8717542 -0.4205161 1.0000000 0.9627571
## petal-width 0.8179536 -0.3565441 0.9627571 1.0000000
Ejercicio: encontrar la correlación de Spearman de la data iris , para las columnas ‘sepal-length’ y ‘class’
Datos Missing o Faltantes: son observaciones que habitualmente no se encuentran por algún error en la recolección, por omisión o por el tipeo de ellos.
¿Que hacer si estamos en presencia de ellos?
Eliminación, se puede realizar cuando no esta presente en todas las variables de análisis, también se utiliza cuando los datos fueron recogidos en forma aleatoria. En caso contrario no se recomienda realizarlo ya que origina sesgo.
Imputación de los datos, consiste en estimar y reemplazar aquellos valores ausentes por estadísticos, aplicación de la muestra, regresión, etc.
Sustitución por la Media o Mediana: se sustituye unos de estos estadísticos por el valor ausente de la variable. Los problemas es que la distribución de la variable se ve alterada, además de la correlación entre las variables.
Sustitución por regresión, mediante un análisis de regresión se sustituye el valor ausente en base a la relación con las restantes variables. Los problemas que se originan es que auemente la relación de las variables, se subestima la varianza.
#ejemplo - banco
import pandas as pd
#datos=pd.read_csv('C:\\Users\\erodrif\\Desktop\\UAI\\banco.csv',header=0, sep=';')
datos=pd.read_csv('./data/banco.csv',header=0, sep=';') #Version Mac
datos1=pd.DataFrame(datos)
#visualiar primeros datos
datos1.head()
#mostrar solo una columna
#datos1['Edad'].head()
#otra forma
#datos1.ix[:,1]
#mostrar varias columnas
#columnas=['Edad','saldopromedio','cupo']
#datos1[columnas]
#mostrar datos desde la fila 1 a la 58
#datos1.ix[1:58]
#ordenar los valores por variable
#datos1.sort_values(by='Edad')
#oredenar por variable en forma descendente
#datos1.sort_values(by='Edad',ascending=False)## id Edad Sexo ... saldopromedio cupo monto_usado
## 0 1 25 H ... 1110 500000 420442
## 1 2 41 H ... 623703 500000 0
## 2 3 41 H ... 13512296 3422000 0
## 3 4 31 H ... 69925 750000 690127
## 4 5 48 H ... 48974 2000000 2000000
##
## [5 rows x 10 columns]
#verificar si hay datos faltantes
datos1.notnull()
#columnas con datos faltantes y completos
datos1.notnull().all()## id True
## Edad True
## Sexo True
## Part_Ciudad False
## Part_Region False
## margen False
## Perfil False
## saldopromedio True
## cupo True
## monto_usado True
## dtype: bool
#insertar datos con respecto al promedio
datos1['margen']=datos1['margen'].fillna(datos1['margen'].mean())
datos1
datos1.notnull().all()
#borrar todos los datos donde este un null (NaN)
#datos2=datos1.dropna()
#verificando
#datos2.notnull().all()
#formar una variable
#datos11=datos1.copy()
#datos11['por_usado']=datos1['monto_usado ']/datos1['cupo']
#print datos11## id True
## Edad True
## Sexo True
## Part_Ciudad False
## Part_Region False
## margen True
## Perfil False
## saldopromedio True
## cupo True
## monto_usado True
## dtype: bool
#ejemplo - banco
datos=read.csv('./data/banco.csv',header=T, sep=';')
#visualiar primeros datos
head(datos)
#mostrar solo una columna
#head(datos$Edad)
#otra forma
#datos[,2]
#mostrar varias columnas
#columnas=c('Edad','saldopromedio','cupo')
#datos[columnas]
#mostrar datos desde la fila 1 a la 58
#datos[1:58,]
#ordenar los valores por variable
#datos[order(datos$Edad),]
#ordenar por variable en forma descendente
#datos[order(datos$Edad,decreasing=T),] ## id Edad Sexo Part_Ciudad Part_Region margen Perfil
## 1 1 25 H Santiago 13 16476 CERCANIA TRX
## 2 2 41 H REQUINOA 6 125300 CERCANIA TRX
## 3 3 41 H NULL NULL 73438 ACTIVO
## 4 4 31 H PADRE LAS CASAS 9 55279 CERCANIA TRX
## 5 5 48 H Santiago 13 273905 CERCANIA TRX
## 6 6 29 M Santiago 13 34002 CERCANIA TRX
## saldopromedio cupo monto_usado
## 1 1110 500000 420442
## 2 623703 500000 0
## 3 13512296 3422000 0
## 4 69925 750000 690127
## 5 48974 2000000 2000000
## 6 2822 700000 700000
# Reemplazaré todo por NA, notar que los NULL están almacenados como texto
datos[datos == ""] = NA
datos[datos == "NULL"] = NA
datos[datos == "NaN"] = NA
#columnas con datos faltantes y completos
apply(datos, 2, function(x) !any(is.na(x)))## id Edad Sexo Part_Ciudad Part_Region
## TRUE TRUE TRUE FALSE FALSE
## margen Perfil saldopromedio cupo monto_usado
## FALSE FALSE TRUE TRUE TRUE
#R entedió esta columna como una factor, la transformo a numérica
datos$margen<-as.numeric(datos$margen)
#insertar datos con respecto al promedio
datos$margen[is.na(datos$margen)] = mean(datos$margen, na.rm=TRUE)
apply(datos, 2, function(x) !any(is.na(x)))
#borrar todos los datos donde este un null (NaN)
#datos<-datos[complete.cases(datos),]
#verificando
#apply(datos, 2, function(x) !any(is.na(x)))
#formar una variable
#datos11=datos
#datos11$'por_usado'=datos$monto_usado/datos$cupo
#datos11## id Edad Sexo Part_Ciudad Part_Region
## TRUE TRUE TRUE FALSE FALSE
## margen Perfil saldopromedio cupo monto_usado
## TRUE FALSE TRUE TRUE TRUE