Mostrando entradas con la etiqueta Estadistica. Mostrar todas las entradas
Mostrando entradas con la etiqueta Estadistica. Mostrar todas las entradas

21 de mayo de 2017

Identificar telefonos falsos

El siguiente script identifica "teléfonos falsos" calculando un ratio de repeticion de digitos, donde un ratio=0 significa que el teléfono es la repeticion de un digito, como 0000-0000-0000, y un ratio mas alto indica mayor distribucion de los digitos.

El calculo es DigitosUnicos/CantidadDigitos, y conceptualmente queda así:














NOTA:
En este script los teléfonos son creados de forma aleatoria y la longitud de dígitos es la mima.


23 de diciembre de 2014

Pronostico de venta (Forecasting)

Esta nota viene de una pregunta del foro publicada AQUI
El qvw de ejemplo puede descargarse AQUI


Si se tiene una tabla de ventas y se quiere predecir ventas futuras, teniendo algo como:


















Para esto puede usarse la siguiente técnica que usa la ecuación de la recta:

3 de agosto de 2014

Predecir Clientes con Bayes Ingenuo

NOTA: 
Para mismo ejemplo con R programming, ver nota publicada AQUI
El script considera variables discretas o categóricas. Para variables numericas, no. 

Una empresa quiere llamar a sus clientes para ofrecerles un nuevo producto, pero quiere contactar únicamente a los clientes con mayor probabilidad de compra, para ahorrar en el costo por llamada.

Si se tienen DATOS HISTÓRICOS (de campañas anteriores o pruebas pilotos) de clientes que SI aceptaron y clientes que NO aceptaron comprar un producto cuando fueron contactados, y también se tienen registros de NUEVOS CLIENTES a los que se le quiere calcular la probabilidad de compra, teniendo algo como:















26 de julio de 2014

Normalizar variable a una escala especifica

Si se quiere normalizar una variable de Puntos Obtenidos en una escala de 1 a 4,  para obtener con escala normalizada como el siguiente:











puede usarse la técnica:

//-------------------------------------------------------------------------------
// 1. Cargar Datos Ejemplo
TablaPuntos_tmp:
 
LOAD * INLINE [
    
Puntos
     100
     10000
     50000
     100000
     200000
     400000
     800000
     1000000]
;


//-------------------------------------------------------------------------------
// 2. Crear campos de maximo y minimo    
Left Join (TablaPuntos_tmp)
LOAD max(Puntos) as MaxPuntos,
    
Min(Puntos) as MinPuntos,
     1           
as MinEscala,
     4           
as MaxEscala
Resident TablaPuntos_tmp;

//-------------------------------------------------------------------------------
//  3. Crear variable Norm_Proporcional_Rango con valor de 0 a 1
//     y usarla luego para crear variable Norm_Escala
TablaPuntos:
LOAD *, Norm_Proporcional_Rango*(MaxEscala-MinEscala)+MinEscala as Norm_Escala;
LOAD *, (Puntos-MinPuntos)/(MaxPuntos-MinPuntos) as Norm_Proporcional_Rango 
Resident TablaPuntos_tmp;
DROP Table TablaPuntos_tmp;



15 de junio de 2014

Crear multiples muestras aleatorias

El siguiente scrip carga la tabla Clientes y de esta crea varios set de datos con muestra aleatoria. Cada set de datos contiene campos elegidos al azar. Esto con el fin implementar metodologia de Consenso (bagging) que crea diferentes modelos con diferentes muestras para predecir perdida de cliente, usando el campo ClienteActivo como Clase ó Campo Objetivo.

Clientes:
LOAD * INLINE [
   IdCliente, ClienteActivo, Edad, EstadoCivil, MontoCompra, CantidadCompra, MesesAntiguedad
    1,         SI,            66, Casado,         33,             4,                   4
    2,         
NO,            25, Soltero,        54,             1,                   8
    3,         SI,            58, Divorciado,     45,             8,                   6
    4,         NO,            57, Viudo,          87,             6,                   1
    5,         SI,            45, Casado,         10,             8,                   6
    6,         NO,            63, Soltero,        34,             4,                   5
    7,         SI,            26, Casado,         12,             1,                   2
    8,         SI,            21, Soltero,        20,            10,                   6
    9,         NO,            26, Casado,         97,             5,                  12
    10,        NO,            28, Soltero,        61,             4,                  10
    11,        NO,            67, Divorciado,     89,            10,                   2
    12,        SI,            27, Viudo,          10,             8,                   9
    13,        NO,            63, Casado,         85,             1,                  12
    14,        NO,            36, Soltero,        97,             6,                   7
    15,        SI,            20, Casado,         26,             5,                  12
    16,        SI,            29, Soltero,        86,             10,                  1
    17,        SI,            41, Casado,         20,             2,                   1
    18,        SI,            21, Soltero,        36,             6,                  11
    19,        NO,            24, Divorciado,     85,             6,                   3
    20,        NO,            47, Viudo,          85,             4,                   4]




let SetInicial='Clientes';
let CampoId='IdCliente';
let CampoObjetivo='ClienteActivo';
let CantCampos=NoOfFields('$(SetInicial)');
FOR CantidadSet=1 to 15
   
let setfinal='$(CampoId)'&', '&'$(CampoObjetivo)';
          
FOR i=Ceil(Rand()*(CantCampos-3)) to CantCampos
            
let Campo_$(i)=if(FieldName(i,'$(SetInicial)')<>'$(CampoId)'
                          
and FieldName(i,'$(SetInicial)')<>'$(CampoObjetivo)'
                          
and rand()>rand(),','&FieldName(i,'$(SetInicial)'),'');
            
let set1=' $'&'(Campo_'&$(i)&')';
            
let setfinal='$(setfinal)'&'$(set1)';  
          
NEXT
  
QUALIFY*; UNQUALIFY $(CampoId);
   Set
$(CantidadSet): LOAD $(setfinal)  Resident $(SetInicial) Where Rand()>0.5;
NEXT  



Los set de datos quedarian como sigue:


8 de junio de 2014

Normalizacion de Variables

El siguiente script crea cuatro campos que transfrorman el valor del campo Venta en diferentes escalas Normalizadas

Norm_Proporcional_Maximo: Indica qué tan lejos está cada venta de la venta máxima.
Norm_Proporcional_Rango:  Crea escala del 0 al 1, donde 0 es menor Venta y 1 máxima Venta.
Norm_Proporcional_Total:  Indica qué porcentaje representa cada venta del total de venta.
Norm_Zscore:              Indica a cuantas desviaciones estándar se aleja cada venta de 
                          la venta promedio.

Para ver otros métodos de normalización, ver Referencia 1


// PASO 1: Carga datos de ejemplo 
Venta_tmp:
CrossTable(Dia,Venta)
LOAD * INLINE [
Sucursal, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado
Norte,    66,     19,       98,      21,      99,      23
Sur,      33,     80,       65,      36,      83,      57
Este,    142,    134,      175,     125,     160,     143
Oeste,    59,     60,       82,     110,      63,      56]
;

//   PASO 2: agrega a la tabla Ventas_tmp las columas con 
//   Venta Maxima, Minima, Total, Desviacion y Promedio
Join
LOAD
max(Venta)      as MaxVenta,
min(Venta)      as MinVenta,
Sum(Venta)      as TotalVenta,
Stdev(Venta)    as DesvVentas,
Avg(Venta)      as PromedioVenta
Resident Venta_tmp;

/// PASO 3: Crea la tabla Ventas con los campos normalizados y borra Ventas_tmp
Ventas:
LOAD*,
Venta/MaxVenta                       as Norm_Proporcional_Maximo
(Venta-MinVenta)/(MaxVenta-MinVenta) as Norm_Proporcional_Rango,
Venta/TotalVenta                     as Norm_Proporcional_Total,
(Venta-PromedioVenta)/DesvVentas     as Norm_Zscore                    
Resident Venta_tmp;

DROP Table Venta_tmp;

Los valores resultante serian los siguientes:


Referencia:

26 de mayo de 2014

Matriz de Correlacion

Si se tienen una tabla de ventas por sucursal, y se quiere identificar cuales sucursales están relacionadas por sus ventas, y obtener una matriz como la siguiente:


3 de febrero de 2014

Gráfico Pareto

Para identificar en color gris cuales son los productos que representan el 80% de las ventas en un gráfico de barras, y obtener la siguiente visualización:












1. Cargar datos ejemplo:
LOAD * INLINE [
    Productos, Venta
    Azucar,       20
    Carne,
       175
    Arroz,
        15
    Leche,
        21
    Vegetales,
    10
    Pescado,
      20
    Marisco,
     135
    Embutido,     20
    Cafe,         12
    Pan,           9
    Frutas,        8
    Bebidas,     198
    Sal,          18]
;

2. Crear gráfico de barra con:
Dimension:  Productos
Expresion: Sum(Venta)

3. En "Definición" del "Color de Fondo" de la expresión, incluir:
if(RangeSum(Above(Sum(Venta), 0, RowNo()))/Sum(total Venta)<.8,DarkGray())

4. En Propiedades\Ordenar marcar opción Expresión>Descendente e incluir  Sum(Venta)


El qvw de ejemplo puede descargarse aqui.


20 de enero de 2014

Selecionar muestra aleatoria

Diferentes técnicas para elegir una muestra de datos de una tabla

1.El siguiente Script asigna a cada registro una probabilidad de 50% de ser seleccionado (cargado), usando la función SAMPLE:
Sample 0.5
LOAD * INLINE [
    Sucursal, Venta
    Norte,    23
    Sur,      54
    Norte,    53
    Oeste,    90
    Sur,      21
    Oeste,    39
    Sur,      84
    Norte,    36
    Este,     33

    Sur,      93]

Para usar Sample en un QVD debe usarse Where, quedando:
Sample 0.5
LOAD SucursalVenta
FROM Datos.qvd
Where 1=1; 

NOTA: La probabilidad con Sample puede ser de 0 a 1


2. Otra técnica para seleccionar una muestra aleatoria es usar la funcion RAND() quedando:
LOAD * WHERE Rand()<0.5;
LOAD * INLINE [
    Sucursal, Venta
    Norte,    23
    Sur,      54
    Norte,    53
    Oeste,    90
    Sur,      21
    Oeste,    39
    Sur,      84
    Norte,    36
    Este,     33
    Sur,      93]
;

3. Para cargar los 100 primeros registros (No Aleatorio) de una tabla, puede usarse:
First 100 LOAD From Datos.qvd


4.Para cargar una cantidad especifica de registros aleatorios, puede crearse un campo aleatorio y despues ordenar la tabla con este campo. Luego que el orden sea aleatorio se eligen, por ejemplo, los primeros 100 registros, y será una elección aleatorios de 100 registros:


Base_Cliente:
LOAD
     
RecNo()     as IdCliente,
     
rand()      as Aleatorio
AutoGenerate
 10000;

Clientes_Aleatorios:
First
100
Noconcatenate

LOAD
 * Resident Base_Cliente
Order
 By Aleatorio;
DROP
 Table Base_Cliente;



5. Para cargar los 100 primeros registros (No Aleatorios) de todas las tablas, ir al Editor Script>Depurar y en Carga Limitada seleccionar 100, luego elegir Ejecutar.

Referencia: https://gist.github.com/ralfbecher/5314810

15 de diciembre de 2013

Gráfico con Intervalos

Uso Función Aggr para Gráfico con Intervalo del 68%, Cuando no existen variables numéricas

El siguiente gráfico muestra en cuáles meses se captaron más clientes nuevos de lo normal, y en cuáles meses se captaron menos clientes de lo normal.

Para este gráfico se utilizó la teoría de Desigualdad de Chebyshev, de la cual deriva la Regla Empírica que indica que el 68% de los datos se encuentra en el intervalo de 1 Desviación estándar, teniendo los siguientes Limites:
Límite Inferior=Promedio MENOS una Desviación Estándar.
Límite Superior= Promedio MAS una Desviación Estándar.

Chebyshev.png
  
Dimensión:
MesIngreso

Expresión:
CountDISTINCT Cliente)

Se agregan las tres líneas en Propiedades del gráfico, pestaña Presentación, y en Linea de Referencia seleccionarAñadir. Se definen las siguientes expresiones en cada línea:

Expresión de Línea “Limite Superior”:
=Stdev(Aggr(Count(DISTINCT Cliente),MesIngreso))
+Avg(AggrCount(DISTINCT Cliente),MesIngreso))

Expression Linea “Promedio”
Avg(AggrCount(DISTINCT Cliente),MesIngreso))

Expression Linea “Limite Inferior”
=Avg(AggrCount(DISTINCT Cliente),MesIngreso))
-
Stdev(AggrCount(DISTINCT Cliente),MesIngreso))

NOTA
Para modificar % del area normal: La Regla Empírica considera 68% de la población para 1 desviación estándar, el 95% población para 2 desviaciones estándar y el 99% a 3 desviaciones estándar. Para otros intervalos Véase Desigualdad de Chebyshev y Regla Empírica.