analyseStatistiques.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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["Q25"] = data.quantile(0.25)
  73. description["Q75"] = data.quantile(0.75)
  74. description["std"] = data.std()
  75. description["std_mean"] = description["std"]/math.sqrt(description["n"])
  76. description["ci_95"] = [description["mean"]-1.96*description["std_mean"],
  77. description["mean"]+1.96*description["std_mean"]]
  78. return description
  79. def _analyse_univarie_quantitative (self, variable, axes = None):
  80. # On sélectionne les données à analyse
  81. temp_data = self._get_sub_table(variable, [])
  82. # On charge un dictionnaire vide
  83. analyse = {}
  84. analyse["n"] = temp_data.shape[0]
  85. ## Globale : en dehors de l'axe d'analyse
  86. analyse["global"] = self._describe_quantitative(temp_data[variable])
  87. ## Spécifique : Dans les axes d'analyse
  88. if (axes is not None):
  89. analyse["sous_groupes"] = {}
  90. analyse["test"] = {}
  91. for axe in axes:
  92. temp_data = self._get_sub_table(variable, [axe])
  93. # Axe values
  94. axe_values = temp_data[axe] \
  95. .drop_duplicates().values.tolist()
  96. # Description
  97. analyse["sous_groupes"][axe] = {}
  98. for values in axe_values:
  99. analyse["sous_groupes"][axe][values] = self._describe_quantitative(
  100. temp_data[
  101. temp_data[axe] == values
  102. ] \
  103. .reset_index(drop = True)[variable]
  104. )
  105. # Test statistique
  106. analyse["test"][axe] = testQuantitatif(temp_data, variable,axe).best_test()
  107. analyse["type"] = "quantitative"
  108. return analyse
  109. def analyse_univarie (self, variables, axes = None):
  110. """
  111. Analyse descriptive univariée
  112. variable : dictionnaire contenant la liste des variables à analyser de la forme :
  113. Key = Nom de la variable, Value : type de variable : quantitative ou qualitative
  114. axes : axes d'analyse de la variable, doivent être de type qualitative. Liste de variables.
  115. """
  116. # Sortie des résultats
  117. resultats = {}
  118. for variable, type_variable in variables.items():
  119. if type_variable == 'qualitative':
  120. resultats[variable] = self._analyse_univarie_qualitative(variable, axes)
  121. elif type_variable == 'quantitative':
  122. resultats[variable] = self._analyse_univarie_quantitative(variable, axes)
  123. return(resultats)