mercredi 11 août 2010

Mensonges statistiques (I)

Dans un article de la libre d'aujourd'hui on nous annonce fièrement:

"L'important patrimoine des familles belges n'est pas tellement imputable aux placements à succès mais au comportement enthousiaste des Belges pour l'épargne. Une famille belge moyenne possède 156.000 euros d'épargne et de placements."

En moyenne une famille belge possède 156.000 euros.

Vraiment ?
Dans un tel cas de figure la moyenne est sans doute le plus mauvais indicateur car elle a tendance à être influencée par les valeurs extrêmes. Evidemment comme dans tout article se référant aux stats nous n'avons pas la distribution. D'où difficulté d'analyser, toutefois voyons cela via un exemple.

Quelqu'un décide d'entrer dans une entreprise de dix personnes et l'on clamme que le salaire moyen est de 3700 euros brut. Heureux notre nouvel employé travail avec zèle et lors de son premier salaire il touche 1000 euros, stuppeur et tremblements...
Notre jeune ami s'est retrouvé floué pour la simple raison que si la distribution des salaires est la suivante:
1000,1000,1000,1000,1000,1000,1000,10000,10000,10000.
Soit 7 employés gagnent 1000 euros
3 managers (CEO,PDG,actionnaire) gagnent 10000 euros soit dix fois plus que les autres.
Alors, la moyenne salariale est bien de 3700 euros, toutefois elle est fortement influencée par les 3 gros salaires des managers. Donc, son salaire sera assez éloigné de 3700 euros.

Dans un tel cas de figure pour être honnête il vaut mieux utiliser la médianne (valeur de l'effectif à la moitié de la distribution ordonnée) et là nous aurions bien trouvé 1000 euros. Notez quand dans le cas d'une distribution normale ça ne pose pas vraiment de problème puisque la moyenne est égale à la médiane.

Dans le cas de l'épargne ci dessus, ce sera semblable car je doute personnellement que la distribution soit normale. La moyenne sera probablement influencée par les gros épargnants qui sont loin de représenter la grosse majorité. Quelqu'un d'honnête aurait donc donné la médiane plus proche de l'épargne réelle plutôt qu'une épargne moyenne fantasmée et certainement surévaluée...

lundi 2 août 2010

SQL-Server Load-Unload

Il existe une commande "DOS" bien pratique pour décharger le contenu d'une table dans un fichier texte. Ce déchargement se fait à une vitesse assez incroyable:

c:\bcp <dbname>..<tablename> out <c:\file.unl> -n -S <server-ip> -U <user> -P <password>

Ex:
c:\bcp txsoct..tblAudit out c:\test.unl -n -S localhost -U toto -P keep_the_secret

L'opération réciproque existe également et permet de recharger une table à une vitesse relativement grande.

c:\bcp <dbname>..<tablename> in <c:\file.unl> -n -S <server-ip> -U <user> -P <password>
Ceci peut s'avérer quelquefois bien utile !

mercredi 30 juin 2010

IIS et les "regional settings"

Ceux qui ont déjà manipulé IIS quelquefois ont probablement eu la désagréable surprise de voir leur application fonctionner très bien dans leur environnement de développement pour ne plus fonctionner du tout lorsque l'on passe en environnement de test. En particulier lorsque cette application se base sur des dates ou des valeurs décimales.

Cela vient du fait qu'IIS utilise deux utilisateurs spéciaux pour s'éxecuter comme service ou exécuter des nouveaux threads.

IUSR_
IWAM_

Ces deux utilisateurs ont leur propre régional settings (basés sur le default). Si les regional settings de ces utilisateurs ne correspondent pas avec ceux de l'environnement de développement, les problèmes apparaissent une solution proposée par Microsoft est la suivante. Forcer IIS à utiliser les default regional settings.

Ceci peut se faire de la manière suivante:
1) A l'aide de regedit, créer ou mettre a jour la clé (DWORD) suivante:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\InetInfo\Parameters\SetVarConversionLocaleSetting = 2
Les valeurs sont les suivantes:
0 - comportement par défaut
1 - utiliser l'impersonisation pour l'utilisateur IIS
2 - Forcer IIS à utiliser les default regional settings

2) Au moyen de l'outil regional settings mettre les settings du user courant comme étant les default regional settings.

3) Redémarrer le serveur pour bénéficier des nouveaux effets.

Pour plus d'informations:
http://support.microsoft.com/kb/306044/en-us

Voilà, ce n'est peut-être pas le moyen le plus simple mais ça marche.

mardi 1 juin 2010

Importing Data into TrialXS

TrialXS is a web application used to collect, review and process study data for clinical Trials.

Currently we develop an interesting tool that allows to import an exported set of data (FLAT Export). This feature is quite interesting because if you can mimic an export of TrialXS by using Excel or every other tool you can potentially re-import those data into TrialXS. Under the condition that your data are consistent at the database level.

To process this import TrialXS, first, checks a lot of criteria that comes from the imported data. Especially the CODE of investigators, sites, ...

The interest is to know how this import features can know if yes or no the patient has already been imported.
As TrialXS users knows the Patient Identifier is recalculated automatically by TrialXS. In the other hand, TrialXS consider for importing a special field called PatExtRef for patient external reference. You must ensure that this PatExtRef must be unique for each imported patient otherwise to make sure that TrialXS will not try to re-import the data for an existing patient in the same study.

From the import process view the PatExtRef is given by the PATID defined in the header of the datafile.

mercredi 26 mai 2010

SQL Server Transaction Log

Le transaction log est le fichier utilisé par SQL Server pour effectuer ses transactions. Ce fichier peut suivant le paramétrage gonfler d'un certain % de son volume chaque fois que ses limites sont atteintes. C'est pourquoi il est bon de temps à autres de faire un SHRINK de ce fichier.

Voici une méthode qui vous donne l'espace utilisé par le transaction log.

SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMBFROM sys.database_files;

La taille restante avant que le fichier ne se mette à gonfler est donnée en MB.

USE DatabaseName
GO
DBCC SHRINKFILE(FileName, 1)
BACKUP LOG DatabaseName WITH TRUNCATE_ONLY
DBCC SHRINKFILE(FileName, 1)
GO

Voici une méthode qui vous permet de réduire drastiquement la taille du transaction Log, ceci dit vous pouvez aussi le faire à partir de l'interface graphique.

jeudi 13 mai 2010

Manipuler des listes génériques en C++

Pour rappel les types génériques sont supportés depuis récemment par un certain nombre de compilateur. Il faut savoir que cette notion existe depuis près de 20ans sous le nom de templates.

L'intérêt d'un type générique est de pouvoir générer des classes adaptables à un type de données particuliers. Ceci est très pratique par exemple pour les listes.
Si vous voulez gérer une liste liée manipulant des entiers, du texte ou des réels vous n'aurez sans doute pas envie de ré-écrire une classe liste par type de données à manipuler.

Le C++ offre depuis longtemps un mécanisme appelé "template" (modèle de classes) qui permet d'effectuer automatiquement cela pour vous.

La plupart des templates standards offerts par défaut avec C++ se trouve dans le module STL. Il suffit d'effectuer en début de code un #include

Vous trouverez ici un petit exemple sur comment créer et manipuler une liste liée générique contenant des chaines de caractères (max 255 caractères).

Le programme fonctionne en mode console et a été crée avec Code::Blocks.
Les options sont les suivantes :
1 permet d'encoder des données dans la liste
2 permet de lister les données, un identifiant est affiché pour pouvoir les supprimer
3 permet de supprimer une donnée de la liste sur base de l'identifiant.

Listing:
ajouter hyperlien...

Questions:

Comment est libéré le list ? Normalement, il détruit automatiquement à la sortie du main ? Qu'advient-il de ses éléments ?
Faut-il faire un erase du contenu avant de sortir du scope de la fonction ??

Transformation de Box-Cox

Les transformations de Box-Cox sont généralement utilisées en régression linéaire pour tenter de corriger :
- la non-linéarité d'un régresseur
- l'hétéroskédasticité des résidus.
- corriger la normalité de la distribution d'une variable (ex: distribution log-normale d'une variable X dont il faut corriger la normalité qui donne une distribution Y qui elle est normale).

Plutôt que de mettre ce régresseur tel quel dans le modèle, on peut le mettre au carré ou prendre son logarithme. La transformation de Box-Cox est une méthode de généralisation de cette approche.
Elle est donnée par l'équation:
Ta(y)=[(y^a)-1]/a
pour a>0
On peut aisément montrer que pour la limite a=0, la transformation de Box-Cox revient à prendre le logarithme de y.

Rappel du calcul des dérivées:
Si y=a^x alors
log(y)=xlog(a)
On différencie les deux membres de l'égalité
dy/y=1*log(a)*dx
dy/dx=y*log(a)
avec y=a^x
dy/dx=a^x*(log(a))

Appliqué à la transformation de Box-Cox cela nous donne:
lim (a->0) [(y^a)-1]/a
On applique la règle de l'Hospital car il s'agit de la recherche de limite d'un quotient. Remarquez que l'on dérive par rapport à a.
par la démonstration précédente, au numérateur il reste : ((y^a)-1)'=(y^a*log(y)-0)
Au dénomiteur la dérivée de a par rapport à a vaut 1. Il reste:
lim (a->0) Ta(y)=y^a*logy=y^0logy=logy.

Le cas particulier d'un transformation de Box-Cox sur une variable avec un a=0 revient à prendre le logarithme de cette variable.