4 Divers algorithmes tels que sup> sont également mis en œuvre. p>
Bibliothèque th>
| Présentation th>
| But de l'utilisation cette fois th>
| URL officielle th>
|
NumPy |
Bibliothèque de calculs numériques td>
| Utilisé pour le calcul numérique dans le traitement statistique td>
| https://www.numpy.org |
pandas |
Bibliothèque d'analyse des données td>
| Utilisé pour la lecture et le formatage des données td>
| https://pandas.pydata.org |
Matplotlib |
Bibliothèque de dessins graphiques td>
| Utilisé pour la visualisation des données td>
| https://matplotlib.org |
scikit-learn |
Bibliothèque d'apprentissage automatique td>
| Utilisé pour implémenter l'analyse en composants principaux (ACP) td>
| https://scikit-learn.org |
Lecture des données Chap.2
Maintenant que les bibliothèques nécessaires ont été chargées au Chap.1, préparez les données à traiter cette fois. Les données traitées cette fois-ci sont de trois types: Snameri ( Neophocaena phocaenoides i>), Suji Dolphin ( Stenella coeruleoalba i>) et Kazuhagondou ( Peponocephala electra i>). Dans les deux cas, téléchargez les données mesurées et les échantillons à partir de la recherche d'échantillons de ChemTHEATER et chargez-les de la même manière que les parties 1 et 2. p>
- Sélectionnez "Sample Search" dans la barre de menu de Chem THEATRE.
- Sélectionnez «Biotiques - Mammifères - Mammifères marins» dans «Type d'échantillon».
- Sélectionnez "Neophocaena phocaenoides" dans "Nom scientifique".
- Cliquez sur le bouton "Rechercher" pour afficher une liste d'échantillons qui remplissent les conditions.
- "Exporter les échantillons" sort les informations sur l'échantillon et "Exporter les données mesurées" sort les valeurs mesurées de la substance chimique cible sous forme de fichier texte délimité par des tabulations.
- Répétez pour les deux autres types.
Après avoir lu chacun des trois fichiers avec succès, combinez les trois fichiers de données mesurées et d'échantillons afin qu'ils puissent être utilisés dans un traitement ultérieur. À ce stade, il est pratique d'utiliser la fonction Pandas concat. Si le paramètre ignore_index est défini sur True, les numéros de colonne du Pandas DataFrame 5 </ sup> à combiner seront renumérotés. </ p>
data_file1 = "measureddata_20191004033314.tsv" #Remplacez la chaîne de caractères saisie dans la variable par le nom de fichier tsv de vos données mesurées
data_file2 = "measureddata_20191004033325.tsv" #Remplacez la chaîne de caractères saisie dans la variable par le nom de fichier tsv de vos données mesurées
data_file3 = "measureddata_20191004033338.tsv" #Remplacez la chaîne de caractères saisie dans la variable par le nom de fichier tsv de vos données mesurées
data1 = pd.read_csv(data_file1, delimiter="\t")
data2 = pd.read_csv(data_file2, delimiter="\t")
data3 = pd.read_csv(data_file3, delimiter="\t")
data = pd.concat([data1, data2, data3], ignore_index=True) #Combinez avec la fonction concat de Pandas
data
|
MeasuredID |
ProjectID |
SampleID |
ScientificName |
ChemicalID |
ChemicalName |
ExperimentID |
MeasuredValue |
AlternativeData |
... |
0 |
80 |
PRA000002 |
SAA000087 |
Neophocaena phocaenoides |
CH0000154 |
TBT |
EXA000001 |
170.0000 |
NaN |
... |
1 |
81 |
PRA000002 |
SAA000087 |
Neophocaena phocaenoides |
CH0000155 |
DBT |
EXA000001 |
220.3591 |
NaN |
... |
2 |
82 |
PRA000002 |
SAA000087 |
Neophocaena phocaenoides |
CH0000156 |
MBT |
EXA000001 |
44.5445 |
NaN |
... |
3 |
83 |
PRA000002 |
SAA000087 |
Neophocaena phocaenoides |
CH0000157 |
ΣBTs |
EXA000001 |
434.9036 |
NaN |
... |
4 |
84 |
PRA000002 |
SAA000087 |
Neophocaena phocaenoides |
CH0000158 |
TPT |
EXA000001 |
12.9220 |
NaN |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
9774 |
24272 |
PRA000036 |
SAA002163 |
Peponocephala electra |
CH0000151 |
cis-nonachlor |
EXA000001 |
170.0000 |
NaN |
... |
9775 |
24056 |
PRA000036 |
SAA002163 |
Peponocephala electra |
CH0000152 |
ΣCHLs |
EXA000001 |
1100.0000 |
NaN |
... |
9776 |
24376 |
PRA000036 |
SAA002163 |
Peponocephala electra |
CH0000153 |
HCB |
EXA000001 |
120.0000 |
NaN |
... |
9777 |
24646 |
PRA000036 |
SAA002163 |
Peponocephala electra |
CH0000533 |
TCPMe |
EXA000001 |
6.1000 |
NaN |
... |
9778 |
24700 |
PRA000036 |
SAA002163 |
Peponocephala electra |
CH0000534 |
TCPMOH |
EXA000001 |
16.0000 |
NaN |
... |
9779 rows × 13 columns
sample_file1 = "samples_20191004033311.tsv" #Remplacez la chaîne de caractères entrée dans la variable par le nom de fichier tsv de vos échantillons
sample_file2 = "samples_20191004033323.tsv" #Remplacez la chaîne de caractères entrée dans la variable par le nom de fichier tsv de vos échantillons
sample_file3 = "samples_20191004033334.tsv" #Remplacez la chaîne de caractères entrée dans la variable par le nom de fichier tsv de vos échantillons
sample1 = pd.read_csv(sample_file1, delimiter="\t")
sample2 = pd.read_csv(sample_file2, delimiter="\t")
sample3 = pd.read_csv(sample_file3, delimiter="\t")
sample = pd.concat([sample1, sample2, sample3], ignore_index=True) #Combinez avec la fonction concat de Pandas
sample
|
ProjectID |
SampleID |
SampleType |
TaxonomyID |
UniqCodeType |
UniqCode |
SampleName |
ScientificName |
CommonName |
CollectionYear |
... |
0 |
PRA000002 |
SAA000087 |
ST004 |
34892 |
es-BANK |
EW00884 |
NaN |
Neophocaena phocaenoides |
Finless porpoises |
1996 |
... |
1 |
PRA000002 |
SAA000088 |
ST004 |
34892 |
es-BANK |
EW00812 |
NaN |
Neophocaena phocaenoides |
Finless porpoises |
1999 |
... |
2 |
PRA000002 |
SAA000089 |
ST004 |
34892 |
es-BANK |
EW00873 |
NaN |
Neophocaena phocaenoides |
Finless porpoises |
1995 |
... |
3 |
PRA000002 |
SAA000090 |
ST004 |
34892 |
es-BANK |
EW04787 |
NaN |
Neophocaena phocaenoides |
Finless porpoises |
2000 |
... |
4 |
PRA000002 |
SAA000091 |
ST004 |
34892 |
es-BANK |
EW00867 |
NaN |
Neophocaena phocaenoides |
Finless porpoises |
1998 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
312 |
PRA000036 |
SAA002159 |
ST004 |
103596 |
es-BANK |
EW04779 |
060301-1 |
Peponocephala electra |
Melon-headed whale |
2006 |
... |
313 |
PRA000036 |
SAA002160 |
ST004 |
103596 |
es-BANK |
EW00115 |
M32625 |
Peponocephala electra |
Melon-headed whale |
2001 |
... |
314 |
PRA000036 |
SAA002161 |
ST004 |
103596 |
es-BANK |
EW00122 |
M32633 |
Peponocephala electra |
Melon-headed whale |
2001 |
... |
315 |
PRA000036 |
SAA002162 |
ST004 |
103596 |
es-BANK |
EW00116 |
M32626 |
Peponocephala electra |
Melon-headed whale |
2001 |
... |
316 |
PRA000036 |
SAA002163 |
ST004 |
103596 |
es-BANK |
EW00117 |
M32627 |
Peponocephala electra |
Melon-headed whale |
2001 |
... |
317 rows × 66 columns
Chap.3 Préparation des données
Après avoir lu les données, l'étape suivante consiste à préparer les données pour qu'elles puissent être analysées. Commencez par extraire les données à utiliser cette fois à partir des données mesurées.
Cette fois, nous utiliserons 5 types de substances chimiques (ΣPCBs, ΣDDTs, ΣPBDEs, ΣCHLs, ΣHCHs) pour 3 types de Sunameri, Suji Dolphin et Kazuhagondou. p>
Tout d'abord, extrayez les données dont l'unité est [ng / g lipide]. En effet, comme mentionné dans la partie 1, les données avec des unités différentes ne peuvent pas être simplement comparées.
Ensuite, extrayez les données dont le nom de la substance chimique est l'un des cinq types ci-dessus et utilisez la méthode reset_index pour renuméroter les lignes. p>
data_lipid = data[(data["Unit"] == "ng/g lipid")]
data_lipid = data_lipid[(data_lipid["ChemicalName"] == "ΣPCBs") | (data_lipid["ChemicalName"] == "ΣDDTs") |
(data_lipid["ChemicalName"] == "ΣPBDEs") | (data_lipid["ChemicalName"] == "ΣCHLs") |
(data_lipid["ChemicalName"] == "ΣHCHs")]
data_lipid = data_lipid.reset_index(drop=True)
data_lipid[data_lipid["SampleID"] == "SAA001941"] #Liste de données avec ID d'échantillon SAA001941
|
MeasuredID |
ProjectID |
SampleID |
ScientificName |
ChemicalID |
ChemicalName |
ExperimentID |
MeasuredValue |
AlternativeData |
... |
115 |
25112 |
PRA000030 |
SAA001941 |
Neophocaena phocaenoides |
CH0000033 |
ΣDDTs |
EXA000001 |
9400.0 |
NaN |
... |
116 |
25098 |
PRA000030 |
SAA001941 |
Neophocaena phocaenoides |
CH0000096 |
ΣPCBs |
EXA000001 |
1100.0 |
NaN |
... |
117 |
25140 |
PRA000030 |
SAA001941 |
Neophocaena phocaenoides |
CH0000146 |
ΣHCHs |
EXA000001 |
41.0 |
NaN |
... |
118 |
25126 |
PRA000030 |
SAA001941 |
Neophocaena phocaenoides |
CH0000152 |
ΣCHLs |
EXA000001 |
290.0 |
NaN |
... |
Une fois l'extraction des données mesurées terminée, l'étape suivante consiste à intégrer la base de données des échantillons et des données mesurées.
Dans les parties 1 et 2, des informations sur l'échantillon (nom scientifique, site de collecte, etc.) ont été ajoutées aux données mesurées de chaque substance chimique, mais cette fois, la valeur mesurée de la substance chimique est donnée à chaque échantillon, alors faites attention à ce que le traitement soit différent d'avant. .. p>
![img08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261241/335f953a-ee33-f6f1-0756-c35ba47aa7c9.png)
#Créer un DataFrame avec uniquement SampleID et un nom scientifique
df = sample[["SampleID", "ScientificName"]]
for chem in ["ΣCHLs", "ΣDDTs", "ΣHCHs", "ΣPBDEs", "ΣPCBs"]: #Traitement en boucle par nom de substance chimique
#Créez un DataFrame pour uniquement les produits chimiques de la liste chimique
data_lipid_chem = data_lipid[data_lipid["ChemicalName"] == chem]
#Nom de la colonne, ne laissant que le SampleID et la valeur mesurée"MeasuredValue"Changement du nom de la substance chimique
data_lipid_chem = data_lipid_chem[["SampleID", "MeasuredValue"]].rename(columns={"MeasuredValue": chem})
data_lipid_chem = data_lipid_chem.drop_duplicates(subset='SampleID')
#Df avec SampleID(ID+Nom scientifique)Et données_lipid_chem(ID+la valeur de mesure)Fusionner
df = pd.merge(df, data_lipid_chem, on="SampleID")
df = df.dropna(how="any") #Supprimer les lignes contenant NaN
df = df.drop("SampleID", axis=1)
df
|
ScientificName |
ΣCHLs |
ΣDDTs |
ΣHCHs |
ΣPBDEs |
ΣPCBs |
0 |
Neophocaena phocaenoides |
770.0 |
68000.0 |
1100.0 |
170.0 |
5700.0 |
1 |
Neophocaena phocaenoides |
1200.0 |
140000.0 |
3500.0 |
120.0 |
6500.0 |
2 |
Neophocaena phocaenoides |
1000.0 |
140000.0 |
5500.0 |
86.0 |
5500.0 |
3 |
Neophocaena phocaenoides |
950.0 |
130000.0 |
6600.0 |
100.0 |
5800.0 |
4 |
Neophocaena phocaenoides |
1400.0 |
280000.0 |
6100.0 |
140.0 |
11000.0 |
... |
... |
... |
... |
... |
... |
... |
89 |
Peponocephala electra |
3000.0 |
15000.0 |
170.0 |
260.0 |
12000.0 |
90 |
Peponocephala electra |
5100.0 |
23000.0 |
380.0 |
490.0 |
19000.0 |
91 |
Peponocephala electra |
5700.0 |
33000.0 |
240.0 |
300.0 |
25000.0 |
92 |
Peponocephala electra |
2800.0 |
12000.0 |
220.0 |
230.0 |
9300.0 |
93 |
Peponocephala electra |
5700.0 |
27000.0 |
240.0 |
180.0 |
21000.0 |
94 rows × 6 columns
Comme indiqué ci-dessus
, le nom scientifique est stocké dans le DataFrame tel qu'il est dans l'état actuel. Puisque le nom de l'espèce sera utilisé pour la visualisation à l'avenir, une variable représentant le nom scientifique sera préparée pour des raisons de commodité. Tout d'abord, créez un dictionnaire qui associe chaque nom scientifique à une valeur (Sunameri: 0, Suji Dolphin: 1, Kazuhagondou: 2). </ p>
species = df["ScientificName"].unique().tolist() #Sortie d'une liste de noms scientifiques dans df
class_dic = {}
for i in range(len(species)):
class_dic[species[i]] = i
class_dic
{'Neophocaena phocaenoides': 0,
'Stenella coeruleoalba': 1,
'Peponocephala electra': 2}
Ensuite, ajoutez la colonne Classe à df et saisissez la valeur correspondant au nom scientifique de chaque ligne dans la colonne Classe. p>
```python
df["Class"] = 0
for irow in range(len(df)):
df.at[irow, "Class"] = class_dic[df.at[irow, "ScientificName"]]
df = df.loc[:, ["Class", "ScientificName", "ΣPCBs", "ΣDDTs", "ΣPBDEs", "ΣCHLs", "ΣHCHs"]]
df
```
|
Class |
ScientificName |
ΣPCBs |
ΣDDTs |
ΣPBDEs |
ΣCHLs |
ΣHCHs |
0 |
0 |
Neophocaena phocaenoides |
5700.0 |
68000.0 |
170.0 |
770.0 |
1100.0 |
1 |
0 |
Neophocaena phocaenoides |
6500.0 |
140000.0 |
120.0 |
1200.0 |
3500.0 |
2 |
0 |
Neophocaena phocaenoides |
5500.0 |
140000.0 |
86.0 |
1000.0 |
5500.0 |
3 |
0 |
Neophocaena phocaenoides |
5800.0 |
130000.0 |
100.0 |
950.0 |
6600.0 |
4 |
0 |
Neophocaena phocaenoides |
11000.0 |
280000.0 |
140.0 |
1400.0 |
6100.0 |
... |
... |
... |
... |
... |
... |
... |
... |
89 |
2 |
Peponocephala electra |
12000.0 |
15000.0 |
260.0 |
3000.0 |
170.0 |
90 |
2 |
Peponocephala electra |
19000.0 |
23000.0 |
490.0 |
5100.0 |
380.0 |
91 |
2 |
Peponocephala electra |
25000.0 |
33000.0 |
300.0 |
5700.0 |
240.0 |
92 |
2 |
Peponocephala electra |
9300.0 |
12000.0 |
230.0 |
2800.0 |
220.0 |
93 |
2 |
Peponocephala electra |
21000.0 |
27000.0 |
180.0 |
5700.0 |
240.0 |
94 rows × 7 columns
Comme il était plus facile d'utiliser le tableau croisé dynamique, modifiez le data_lipid et le dessous comme suit.
df = pd.pivot_table(data_lipid, index=['ScientificName', 'SampleID'], columns='ChemicalName', values=['MeasuredValue'])
df = df.dropna(how="any") #Supprimer les lignes contenant NaN
df
|
|
MeasuredValue |
|
ChemicalName |
ΣCHLs |
ΣDDTs |
ΣHCHs |
ΣPBDEs |
ΣPCBs |
ScientificName |
SampleID |
|
|
|
|
|
Neophocaena phocaenoides |
SAA001903 |
770.0 |
68000.0 |
1100.0 |
170.0 |
5700.0 |
SAA001904 |
1200.0 |
140000.0 |
3500.0 |
120.0 |
6500.0 |
SAA001905 |
1000.0 |
140000.0 |
5500.0 |
86.0 |
5500.0 |
SAA001906 |
950.0 |
130000.0 |
6600.0 |
100.0 |
5800.0 |
SAA001907 |
1400.0 |
280000.0 |
6100.0 |
140.0 |
11000.0 |
... |
... |
... |
... |
... |
... |
... |
Stenella coeruleoalba |
SAA001984 |
730.0 |
3500.0 |
40.0 |
84.0 |
3200.0 |
SAA001985 |
7300.0 |
44000.0 |
300.0 |
530.0 |
26000.0 |
SAA001986 |
12000.0 |
88000.0 |
490.0 |
850.0 |
42000.0 |
SAA001987 |
9100.0 |
56000.0 |
380.0 |
650.0 |
32000.0 |
SAA001988 |
11000.0 |
67000.0 |
520.0 |
610.0 |
36000.0 |
94 rows × 5 columns
À partir de ce moment, l'analyse est effectuée à l'aide du bloc de données du tableau croisé dynamique.
Chap.4 Visualisation de l'aperçu des données
Maintenant que la préparation des données est terminée, visualisons et vérifions toutes les données pour le moment. Les données manipulées cette fois sont de 5 dimensions (il y a 5 variables explicatives). Puisque les humains ne peuvent pas saisir l'espace à cinq dimensions, il est impossible de visualiser la distribution de toutes les données à cinq dimensions telles qu'elles sont. Ici, la carte de distribution $ {} _ 5 C_2 = 10 $ est générée. p>
Il est pratique d'utiliser la fonction pandas.plotting.scatter_matrix () de pandas pour visualiser le diagramme de dispersion de plusieurs variables. Dans la fonction scatter_matrix (), spécifiez la plage à visualiser avec le paramètre frame. Cette fois, toutes les lignes et colonnes de df sont toutes après 6 sup>. p>
pd.plotting.scatter_matrix(
frame=df["MeasuredValue"],
c=list(df["MeasuredValue"].iloc[:, 0]),
alpha=0.5)
plt.show()
![output_03_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261241/4a210a9e-397e-5e21-a09a-3c1198876019.png)
Chap.5 Analyse en composantes principales
Dans
Chap.4, une carte de distribution de $ {} _ 5 C_2 = 10 $ a été générée comme un aperçu de l'ensemble des données. Cependant, avec cela, seule la distribution des données pour chaque combinaison de deux types de substances chimiques peut être confirmée. En d'autres termes, il n'est pas possible d'obtenir une vue d'ensemble de l'ensemble des données à 5 dimensions. Par conséquent, les données 5D sont résumées et visualisées par l'analyse des composants principaux. </ p>
Premièrement, étant donné que la longueur de chaque axe est différente telle qu'elle est, standardisez 7 sup> pour chaque variable et définissez la longueur de tous les axes en 5 dimensions. Unifier. p>
dfs = df.apply(lambda x: (x-x.mean())/x.std(), axis=0)
dfs
|
|
MeasuredValue |
|
ChemicalName |
ΣCHLs |
ΣDDTs |
ΣHCHs |
ΣPBDEs |
ΣPCBs |
ScientificName |
SampleID |
|
|
|
|
|
Neophocaena phocaenoides |
SAA001903 |
-0.743053 |
0.320011 |
0.179064 |
-0.308268 |
-0.768856 |
SAA001904 |
-0.588580 |
1.574027 |
1.297534 |
-0.528241 |
-0.693375 |
SAA001905 |
-0.660428 |
1.574027 |
2.229592 |
-0.677822 |
-0.787727 |
SAA001906 |
-0.678390 |
1.399859 |
2.742224 |
-0.616230 |
-0.759421 |
SAA001907 |
-0.516732 |
4.012392 |
2.509209 |
-0.440252 |
-0.268792 |
... |
... |
... |
... |
... |
... |
... |
Stenella coeruleoalba |
SAA001984 |
-0.757422 |
-0.803378 |
-0.314927 |
-0.686621 |
-1.004736 |
SAA001985 |
1.602782 |
-0.097994 |
-0.193759 |
1.275535 |
1.146484 |
SAA001986 |
3.291208 |
0.668349 |
-0.105213 |
2.683360 |
2.656112 |
SAA001987 |
2.249413 |
0.111009 |
-0.156477 |
1.803469 |
1.712595 |
SAA001988 |
2.931969 |
0.302594 |
-0.091233 |
1.627491 |
2.090001 |
94 rows × 5 columns
Vous pouvez également utiliser le Scaler standard pour la normalisation.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(df)
scaler.transform(df)
dfs = pd.DataFrame(scaler.transform(df), columns=df.columns)
dfs
|
MeasuredValue |
ChemicalName |
ΣCHLs |
ΣDDTs |
ΣHCHs |
ΣPBDEs |
ΣPCBs |
0 |
-0.747037 |
0.321727 |
0.180024 |
-0.309921 |
-0.772979 |
1 |
-0.591736 |
1.582467 |
1.304491 |
-0.531073 |
-0.697093 |
2 |
-0.663969 |
1.582467 |
2.241547 |
-0.681457 |
-0.791950 |
3 |
-0.682027 |
1.407365 |
2.756927 |
-0.619534 |
-0.763493 |
4 |
-0.519503 |
4.033907 |
2.522663 |
-0.442612 |
-0.270233 |
... |
... |
... |
... |
... |
... |
89 |
-0.761484 |
-0.807686 |
-0.316615 |
-0.690303 |
-1.010123 |
90 |
1.611376 |
-0.098520 |
-0.194798 |
1.282374 |
1.152631 |
91 |
3.308856 |
0.671933 |
-0.105778 |
2.697748 |
2.670354 |
92 |
2.261475 |
0.111604 |
-0.157316 |
1.813139 |
1.721777 |
93 |
2.947690 |
0.304217 |
-0.091722 |
1.636218 |
2.101208 |
94 rows × 5 columns
Après la normalisation, effectuez une analyse des composants principaux. Ici, le résultat de Standard Scaler est utilisé.
Sklearn.decomposition.PCA () de Scikit-learn est utilisé pour l'analyse des composants principaux.
Dans l'analyse en composantes principales, tout d'abord, une variable synthétique (première composante principale) est créée afin de dessiner un axe dans la direction dans laquelle la variation de la distribution des données est maximisée, puis la deuxième composante principale est utilisée pour compléter les données perdues dans la variable composite. Créez le troisième composant principal et les variables synthétiques. Après cela, si les données sont transférées dans l'espace centré sur chaque composant principal, le reste n'est qu'interprété. p>
pca = PCA()
feature = pca.fit(dfs) #Analyse des composants principaux
feature = pca.transform(dfs) #Transférer les données vers l'espace des composants principaux
pd.DataFrame(feature, columns=["PC{}".format(x + 1) for x in range(len(dfs.columns))])
|
PC1 |
PC2 |
PC3 |
PC4 |
PC5 |
0 |
-0.931614 |
0.574985 |
0.348535 |
-0.188477 |
-0.178934 |
1 |
-0.525203 |
2.177125 |
0.038871 |
-0.242288 |
-0.498098 |
2 |
-0.700197 |
2.892482 |
-0.248495 |
0.251040 |
-0.282242 |
3 |
-0.720222 |
3.155379 |
-0.366880 |
0.634978 |
-0.017083 |
4 |
0.554487 |
4.585518 |
0.039662 |
-0.952484 |
-0.965309 |
... |
... |
... |
... |
... |
... |
89 |
-1.607963 |
-0.471519 |
0.077579 |
0.103413 |
-0.068820 |
90 |
2.190969 |
-0.704970 |
0.009171 |
0.563020 |
0.053168 |
91 |
4.974287 |
-0.699630 |
0.023300 |
0.765578 |
0.013150 |
92 |
3.218248 |
-0.753396 |
-0.005256 |
0.688830 |
0.065009 |
93 |
3.804695 |
-0.750210 |
-0.513720 |
0.727646 |
-0.224109 |
94 rows × 5 columns
Trouvons également le vecteur propre. Le vecteur propre est comme la "force d'inclinaison de l'axe" appliquée lors du transfert des données d'origine vers l'espace de l'axe du composant principal. p>
Le calcul des vecteurs propres en Python est implémenté dans les composants_ inclus dans l'ACP de scikit-learn. p>
pd.DataFrame(pca.components_, columns=df.columns[2:], index=["PC{}".format(x + 1) for x in range(len(dfs.columns))])
|
MeasuredValue |
ChemicalName |
ΣCHLs |
ΣDDTs |
ΣHCHs |
ΣPBDEs |
ΣPCBs |
PC1 |
0.572482 |
0.307088 |
-0.005288 |
0.488078 |
0.582848 |
PC2 |
-0.212874 |
0.641425 |
0.730929 |
-0.048824 |
-0.081347 |
PC3 |
-0.328297 |
0.180897 |
-0.249982 |
0.782267 |
-0.430192 |
PC4 |
0.427788 |
-0.529630 |
0.566847 |
0.279604 |
-0.370130 |
PC5 |
-0.579799 |
-0.425488 |
0.286195 |
0.263203 |
0.575856 |
Maintenant que nous connaissons le vecteur propre, nous allons trouver les valeurs propres de chaque composant principal. La valeur propre est un coefficient associé au vecteur propre et est un indice indiquant la taille de chaque axe de composante principale. p>
En Python, le taux de cotisation peut être calculé à l'aide de la variable_expliquée_ incluse dans l'ACP de scicit-learn. p>
pd.DataFrame(pca.explained_variance_, index=["PC{}".format(x + 1) for x in range(len(dfs.columns))])
|
0 |
PC1 |
2.301828 |
PC2 |
1.526633 |
PC3 |
0.681585 |
PC4 |
0.450884 |
PC5 |
0.092834 |
Ensuite, trouvez le taux de cotisation. Le taux de cotisation est un indice indiquant la quantité d'informations que chaque axe de composante principale explique dans les données. En d'autres termes, la composante principale avec un taux de cotisation de 60% peut expliquer 60% du total des données et en perdre 40%. p>
En Python, le taux de cotisation peut être calculé à l'aide de la valeur expliquée_variance_ratio_ incluse dans l'ACP de scicit-learn. p>
pd.DataFrame(pca.explained_variance_ratio_, index=["PC{}".format(x + 1) for x in range(len(dfs.columns))])
|
0 |
PC1 |
0.455468 |
PC2 |
0.302078 |
PC3 |
0.134867 |
PC4 |
0.089218 |
PC5 |
0.018369 |
Ici, le taux de cotisation cumulé est également calculé. La raison pour laquelle le taux de cotisation cumulatif est nécessaire est de voir «quel pourcentage des données est perdu». En d'autres termes, si vous examinez les principaux composants qui ont un taux de cotisation cumulé supérieur à un certain niveau, vous pouvez réduire le nombre de dimensions et obtenir une vue d'ensemble de l'ensemble des données. p>
Ici, la valeur totale cumulée est calculée à l'aide de la fonction cumsum de numpy. p>
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution rate")
plt.grid()
plt.show()
![output_03_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261241/254e2003-aa1a-3417-e71a-6fa24d7a524b.png)
En ce qui concerne chaque axe de composant principal généré, je ne suis pas sûr de ce que cela signifie tel quel. Cependant, en visualisant la contribution de chaque variable dans la composante principale, la signification de chaque composante principale peut être vue. Ici, la contribution de chaque variable dans la première composante principale et la deuxième composante principale est tracée sur un diagramme de dispersion. p>
```python
plt.figure()
for x, y, name in zip(pca.components_[0], pca.components_[1], df["MeasuredValue"].columns[:]):
plt.text(x, y, name)
plt.scatter(pca.components_[0], pca.components_[1], alpha=0.8)
plt.grid()
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.show()
```
![output_03_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261241/b0dff0d8-5ca9-9951-8fe5-e790b45f9c40.png)
Enfin, visualisez le résultat de l'analyse des composants principaux. En général, les principaux éléments ayant une valeur unique de 1 ou plus ou un taux de cotisation cumulé de 80% ou plus sont adoptés et la répartition est examinée par la combinaison des composants principaux adoptés. Dans ce cas, on suppose que jusqu'au deuxième composant principal est adopté et visualisé dans le graphique. Comme avec un diagramme de dispersion général, vous pouvez utiliser la fonction scatter de matplotlib et spécifier le premier composant principal (0ème colonne d'entité) et le deuxième composant principal (1ère colonne d'entité) pour chacun des paramètres X et Y. p>
plt.figure()
plt.scatter(x=feature[:, 0], y=feature[:, 1], alpha=0.8, c=list(df.iloc[:, 0])) #Décrire le codage couleur du tracé en c
plt.grid()
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.show()
![output_33_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261241/baedcbca-9167-9520-9e97-a3e8ef3f3989.png)
note de bas de page
1 sup> Une variable explicative est une variable qui explique la variable objective qui est le résultat souhaité. En d'autres termes, pour la variable objective qui indique le résultat, la variable qui le cause est la variable explicative. Également une variable indépendante. p>
2 sup> Une variable créée en combinant plusieurs variables. Dans l'analyse en composantes principales, chaque composante principale est une variable synthétique. p>
3 sup> Logiciels ou bibliothèques dont le code source, qui est le dessin de conception d'un programme, est largement divulgué au grand public. Tout le monde peut l'utiliser gratuitement tant qu'il se situe dans la plage autorisée par la licence. De plus, comme tout le monde peut le développer, il est facile de le mettre à jour du point de vue de l'utilisateur et de corriger les bogues qui ne sont pas remarqués par un petit nombre de personnes.
Python, Jupyter Notebook et Anaconda sont tous des logiciels open source. p>
4 sup> Les deux sont des méthodes utilisées dans l'apprentissage automatique. La classification est la classification d'images et la régression est utilisée pour les prévisions futures telles que les cours des actions. Le clustering est utilisé pour regrouper des données similaires en fonction des tendances des données. p>
5 sup> Un type de données qui stocke des données tabulaires dans Pandas. Manipulez les données en spécifiant des cellules, des lignes et des colonnes comme si vous lisiez un fichier au format CSV ou TSV avec Excel. p>
6 sup> En python, les nombres commencent par "0". p>
7 sup> L'opération consistant à soustraire la valeur moyenne de la valeur mesurée et à la diviser par l'écart type. p>