analyseStatistiques.py 5.8 KB

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