Logo elodees  elodees

Une IA bien-veillante pour un monde meilleur













Seuls les caractères alphabétiques accentués ou non ainsi que l'espace sont acceptés

Logo IA




Analyse factorielle des correspondances AFC





Pas encore de compte ?

Inscrivez-vous pour accéder à tous les contenus




L'analyse factorielle des correspondances (AFC) est une extension de l'analyse en composantes principales (ACP) pour analyser l'association entre deux variables qualitatives ou catégorielles.

Analyse en Composantes Principales ACP


L'AFC permet de résumer et de visualiser l'information contenue dans le tableau de contingence formé par les deux variables catégorielles.

Le tableau de contingence contient les fréquences formées par les deux variables.

L'AFC retourne les coordonnées des éléments des colonnes et des lignes du tableau de contingence.

Ces coordonnées permettent de visualiser graphiquement l'association entre les éléments de lignes et de colonnes dans un graphique à deux dimensions.

Lors de l'analyse d'un tableau de contingence, une question typique est de savoir si certains éléments lignes sont associés à certains éléments colonnes.

L'analyse factorielle par correspondance est une approche géométrique pour visualiser les lignes et les colonnes d'une table de contingence dans un graphique en nuage de points, de sorte que les positions des points lignes et celles des points colonnes correspondent à leurs associations dans le tableau.





Analyse Factorielle des Correspondances Simples (AFC) avec Python



USAccDeaths.csv



"Year","January","February","March","April","May","June","July","August","September","October","November","December"
"1973",9007,8106,8928,9137,10017,10826,11317,10744,9713,9938,9161,8927
"1974",7750,6981,8038,8422,8714,9512,10120,9823,8743,9129,8710,8680
"1975",8162,7306,8124,7870,9387,9556,10093,9620,8285,8466,8160,8034
"1976",7717,7461,7767,7925,8623,8945,10078,9179,8037,8488,7874,8647
"1977",7792,6957,7726,8106,8890,9299,10625,9302,8314,8850,8265,8796
"1978",7836,6892,7791,8192,9115,9434,10484,9827,9110,9070,8633,9240

...



Testé sous Anaconda et Python 3.7

# -*- coding: utf-8 -*-
"""
Created on Wed Jun 22 15:21:23 2022
 
@author: https://github.com/fxjollois/cours-2021-2022/blob/main/insa-ms-esd--ml/afc-python.ipynb
"""
#Librairies utilisées
import pandas
import numpy
import matplotlib.pyplot as plt
import seaborn
seaborn.set_style("white")
 
from prince import CA
 
#Données utilisées
df = pandas.read_csv("USAccDeaths.csv", index_col = "Year")
df.columns.rename("Month", inplace = True)
df.index.rename("Year", inplace = True)
print(df)
 
#Calcul de AFC
ca = CA(n_components=6)
ca.fit(df)
print(ca)
 
#Valeurs propres
print(ca.eigenvalues_)
print(ca.total_inertia_)
print(ca.explained_inertia_)
 
eig = pandas.DataFrame(
    { 
        "Dimension" : ["Dim" + str(x + 1) for x in range(6)],
        "Valeur propre": ca.eigenvalues_,
        "% variance expliquée": numpy.round(ca.explained_inertia_, 4) * 100,
        "% variance expliquée cumulée": numpy.round(numpy.cumsum(ca.explained_inertia_), 4) * 100,
    }
)
print(eig)
 
#Choix des facteurs
plt.figure(figsize=(16, 6))
g_eig = seaborn.barplot(x = "Dimension", 
                        y = "% variance expliquée",
                        palette = ["lightseagreen"],
                        data = eig)
g_eig.set(ylabel = "Variance expliquée (%)")
g_eig.figure.suptitle("Variance expliquée par dimension")
 
plt.show()
 
#Représentation des lignes
df_row = pandas.DataFrame(ca.row_coordinates(df)).rename(columns = {0: "Dim1", 1: "Dim2"})
print(df_row)
 
g_row = seaborn.lmplot(x = "Dim1", y = "Dim2", data = df_row, fit_reg = False, 
                       height = 4, aspect = 3)
g_row.fig.suptitle("Modalités en lignes")
for i in df_row.index:
    plt.text(df_row.loc[i].Dim1, df_row.loc[i].Dim2, i, size = "xx-large")
plt.show()
 
#Représentation des colonnes
df_col = pandas.DataFrame(ca.column_coordinates(df)).rename(columns = {0: "Dim1", 1: "Dim2"})
print(df_col)
 
g_col = seaborn.lmplot(x = "Dim1", y = "Dim2", data = df_col, fit_reg = False, 
                       height = 4, aspect = 3)
g_col.fig.suptitle("Modalités en colonnes")
for i in df_col.index:
    plt.text(df_col.loc[i].Dim1, df_col.loc[i].Dim2, i, size = "xx-large")
plt.show()
 
#Représentation simultanée
ca.plot_coordinates(df,
                    figsize=(16, 8));
 
fig = plt.figure(figsize = (16,8))
plt.xlim(-.05, .05)
plt.ylim(-.05, .05)
 
for i in df_row.index:
    plt.scatter(df_row.loc[i].Dim1, df_row.loc[i].Dim2, alpha = .25, c = "black")
    plt.text(df_row.loc[i].Dim1, df_row.loc[i].Dim2, i, size = "xx-large", color = "darkblue", ha = "center")
 
for i in df_col.index:
    plt.scatter(df_col.loc[i].Dim1, df_col.loc[i].Dim2, alpha = .25, c = "black")
    plt.text(df_col.loc[i].Dim1, df_col.loc[i].Dim2, i, size = "xx-large", color = "darkred", ha = "center")
 
fig.suptitle("Représentation conjointe")
plt.show()
 
#Importance de chaque modalité
plt.figure(figsize = (16, 4))
plt.bar(df.index, ca.row_masses_, color = "darkblue")
plt.show()
 
plt.figure(figsize = (16, 4))
plt.bar(df.columns, ca.col_masses_, color = "darkred")
plt.show()
 
#AFC - Profils lignes
p_row = df.div(df.sum(axis=1), axis=0).round(4) * 100
print(p_row)
 
fig = plt.figure(figsize = (16, 8))
base = numpy.zeros(6)
for m in p_row.columns:
    plt.bar(p_row.index, p_row[m], bottom = base, label = m)
    base = base + p_row[m]
plt.margins(0.05, 0.15)
plt.legend(ncol = 6, loc = 9)
plt.show()
 
#AFC - Profils colonnes
p_col = df.div(df.sum(axis=0), axis=1).round(4) * 100
print(p_col)
 
fig = plt.figure(figsize = (16, 8))
base = numpy.zeros(12)
for m in p_col.index:
    plt.bar(p_col.columns, p_col.loc[m], bottom = base, label = m)
    base = base + p_col.loc[m]
plt.margins(0.05, 0.15)
plt.legend(ncol = 6, loc = 9)
plt.show()
 


Analyse Factorielle des Correspondances Simples (AFC) - Mastère ESD - Introduction au Machine Learning - GitHub



Month January February March April ... September October November December
Year ...
1973 9007 8106 8928 9137 ... 9713 9938 9161 8927
1974 7750 6981 8038 8422 ... 8743 9129 8710 8680
1975 8162 7306 8124 7870 ... 8285 8466 8160 8034
1976 7717 7461 7767 7925 ... 8037 8488 7874 8647
1977 7792 6957 7726 8106 ... 8314 8850 8265 8796
1978 7836 6892 7791 8192 ... 9110 9070 8633 9240

[6 rows x 12 columns]
CA(n_components=6)
[0.00037628345587226603, 0.00018567008371735225, 7.5783185262004e-05, 3.7689444682241765e-05, 2.457913831520349e-05, 4.200096377733426e-33]
0.0007000053078490678
[0.5375437181019186, 0.2652409655119153, 0.10826087232804818, 0.053841655569800626, 0.03511278848831692, 6.0000921859281575e-30]
Dimension Valeur propre % variance expliquée % variance expliquée cumulée
0 Dim1 3.762835e-04 53.75 53.75
1 Dim2 1.856701e-04 26.52 80.28
2 Dim3 7.578319e-05 10.83 91.10
3 Dim4 3.768944e-05 5.38 96.49
4 Dim5 2.457914e-05 3.51 100.00
5 Dim6 4.200096e-33 0.00 100.00
Dim1 Dim2 2 3 4 5
1973 0.017407 -0.013220 0.004260 0.004290 0.006992 -0.525168
1974 -0.013806 -0.014447 0.011227 -0.001709 -0.006420 -0.525168
1975 0.030026 -0.000779 -0.009876 -0.003899 -0.005081 -0.525168
1976 0.003461 0.024649 0.009397 -0.004836 0.002169 -0.525168
1977 -0.011677 0.010810 -0.004949 0.011591 -0.002571 -0.525168
1978 -0.026633 -0.004477 -0.010296 -0.005888 0.004086 -0.525168
Dim1 Dim2 2 3 4 5
January 0.023375 0.003002 -0.004639 0.001429 0.001994 1.0
February 0.029632 0.024436 0.014401 -0.006230 0.005528 1.0
March 0.018686 -0.000595 0.006133 -0.003373 -0.006826 1.0
April -0.006568 -0.003396 0.013345 0.004948 -0.001407 1.0
May 0.018069 0.002971 -0.018906 -0.002541 -0.001863 1.0
June 0.013585 -0.011738 -0.001110 0.005372 0.000419 1.0
July -0.006641 0.014813 -0.006718 0.011894 0.000836 1.0
August 0.001480 -0.010823 0.000180 -0.007366 -0.002311 1.0
September -0.014577 -0.019645 -0.003744 -0.005379 0.011479 1.0
October -0.013734 -0.007586 0.008094 0.006472 0.002180 1.0
November -0.015175 -0.012299 0.000979 -0.001664 -0.008809 1.0
December -0.041467 0.024106 -0.002788 -0.006655 -0.000887 1.0
Month January February March April ... September October November December
Year ...
1973 7.78 7.00 7.71 7.89 ... 8.39 8.58 7.91 7.71
1974 7.41 6.67 7.68 8.05 ... 8.36 8.73 8.33 8.30
1975 7.92 7.09 7.88 7.64 ... 8.04 8.21 7.92 7.80
1976 7.66 7.41 7.71 7.87 ... 7.98 8.43 7.82 8.58
1977 7.57 6.76 7.51 7.88 ... 8.08 8.60 8.03 8.55
1978 7.42 6.53 7.38 7.76 ... 8.62 8.59 8.17 8.75

[6 rows x 12 columns]
Month January February March April ... September October November December
Year ...
1973 18.66 18.55 18.46 18.40 ... 18.61 18.42 18.03 17.06
1974 16.06 15.97 16.62 16.96 ... 16.75 16.92 17.14 16.59
1975 16.91 16.72 16.79 15.85 ... 15.87 15.69 16.06 15.35
1976 15.99 17.07 16.06 15.96 ... 15.40 15.74 15.50 16.53
1977 16.14 15.92 15.97 16.33 ... 15.93 16.41 16.27 16.81
1978 16.24 15.77 16.11 16.50 ... 17.45 16.81 16.99 17.66

[6 rows x 12 columns]



Image gratuite et libre de droits fournie par pexel.com



Image gratuite et libre de droits fournie par pexel.com



Image gratuite et libre de droits fournie par pexel.com



Image gratuite et libre de droits fournie par pexel.com



Image gratuite et libre de droits fournie par pexel.com



Image gratuite et libre de droits fournie par pexel.com



Image gratuite et libre de droits fournie par pexel.com



Image gratuite et libre de droits fournie par pexel.com




Apprentissage profond

Apprentissage automatique










Bienvenu, je m’appelle Eric Soupet et je suis l'administrateur du site elodees.com. elodees.com est un état de l'art de l'Intelligence Artificielle et se veut collaboratif, vous pouvez dès à présent proposer du contenu tels que des articles, des événements, des tutoriels, ... alors n'hésitez pas !

Crédit des images de la plate-forme : Pixabay - Pixabay License | Pexels - Pexels License