analyseStatistiques.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import math
  2. import pandas as pd
  3. from .test import testQualitatif, testQuantitatif
  4. class analyseStatistiques ():
  5. """
  6. Permet l'analyse d'un jeu de données.
  7. Analyses univariés :
  8. Description des données
  9. Application des tests
  10. Input : dataset
  11. """
  12. def __init__ (self, df):
  13. # Chargement du dataframe
  14. self.df = df
  15. def _describe_qualitative (self, data):
  16. """
  17. Calculate n and p of each modalitie of the qualitative value
  18. Input : data, Pandas Series containing data to describe
  19. """
  20. table = data.value_counts()
  21. description = pd.DataFrame({'n':table, 'p':table/table.sum()}) \
  22. .to_dict("index")
  23. description["total"] = table.sum()
  24. return(description)
  25. def _get_sub_table(self, variable, axes):
  26. # On sélectionne les données à analyse
  27. if (axes is None):
  28. temp_data = self.df[[variable]]
  29. else:
  30. temp_data = self.df[[variable]+axes]
  31. temp_data = temp_data.dropna()
  32. return(temp_data)
  33. def _analyse_univarie_qualitative (self, variable, axes = None):
  34. temp_data = self._get_sub_table(variable, [])
  35. # On charge un dictionnaire vide
  36. analyse = {}
  37. analyse["n"] = temp_data.shape[0]
  38. ## Globale : en dehors de l'axe d'analyse
  39. analyse["global"] = self._describe_qualitative(temp_data[variable])
  40. ## Spécifique : Dans les axes d'analyse
  41. if (axes is not None):
  42. analyse["sous_groupes"] = {}
  43. analyse["test"] = {}
  44. for axe in axes:
  45. temp_data = self._get_sub_table(variable, [axe])
  46. # Axe values
  47. axe_values = temp_data[axe] \
  48. .drop_duplicates().values.tolist()
  49. # Description
  50. analyse["sous_groupes"][axe] = {}
  51. for values in axe_values:
  52. analyse["sous_groupes"][axe][values] = self._describe_qualitative(
  53. temp_data[
  54. temp_data[axe] == values
  55. ] \
  56. .reset_index(drop = True)[variable]
  57. )
  58. # Test statistique
  59. analyse["test"][axe] = testQualitatif(temp_data, variable,axe).best_test()
  60. analyse["type"] = "qualitative"
  61. return analyse
  62. def _describe_quantitative (self, data):
  63. """
  64. Calculate mean, median, Q25, 50, 27, std, std_mean and CI for quantitative data
  65. Input : data, Pandas Series containing data to describe
  66. """
  67. # Dict containing data
  68. description = {}
  69. description["n"] = data.shape[0]
  70. description["mean"] = data.mean()
  71. description["median"] = data.median()
  72. description["min"] = data.min()
  73. description["Q25"] = data.quantile(0.25)
  74. description["Q75"] = data.quantile(0.75)
  75. description["max"] = data.max()
  76. description["std"] = data.std()
  77. description["std_mean"] = description["std"]/math.sqrt(description["n"])
  78. description["ci_95"] = [description["mean"]-1.96*description["std_mean"],
  79. description["mean"]+1.96*description["std_mean"]]
  80. return description
  81. def _analyse_univarie_quantitative (self, variable, axes = None):
  82. # On sélectionne les données à analyse
  83. temp_data = self._get_sub_table(variable, [])
  84. # On charge un dictionnaire vide
  85. analyse = {}
  86. analyse["n"] = temp_data.shape[0]
  87. ## Globale : en dehors de l'axe d'analyse
  88. analyse["global"] = self._describe_quantitative(temp_data[variable])
  89. ## Spécifique : Dans les axes d'analyse
  90. if (axes is not None):
  91. analyse["sous_groupes"] = {}
  92. analyse["test"] = {}
  93. for axe in axes:
  94. temp_data = self._get_sub_table(variable, [axe])
  95. # Axe values
  96. axe_values = temp_data[axe] \
  97. .drop_duplicates().values.tolist()
  98. # Description
  99. analyse["sous_groupes"][axe] = {}
  100. for values in axe_values:
  101. analyse["sous_groupes"][axe][values] = self._describe_quantitative(
  102. temp_data[
  103. temp_data[axe] == values
  104. ] \
  105. .reset_index(drop = True)[variable]
  106. )
  107. # Test statistique
  108. analyse["test"][axe] = testQuantitatif(temp_data, variable,axe).best_test()
  109. analyse["type"] = "quantitative"
  110. return analyse
  111. def analyse_univarie (self, variables, axes = None):
  112. """
  113. Analyse descriptive univariée
  114. variable : dictionnaire contenant la liste des variables à analyser de la forme :
  115. Key = Nom de la variable, Value : type de variable : quantitative ou qualitative
  116. axes : axes d'analyse de la variable, doivent être de type qualitative. Liste de variables.
  117. """
  118. # Sortie des résultats
  119. resultats = {}
  120. for variable, type_variable in variables.items():
  121. if type_variable == 'qualitative':
  122. resultats[variable] = self._analyse_univarie_qualitative(variable, axes)
  123. elif type_variable == 'quantitative':
  124. resultats[variable] = self._analyse_univarie_quantitative(variable, axes)
  125. return(resultats)