[PYTHON] Quand on m'a montré un graphique comme l'analyse en composantes principales, «les distributions de ces deux données ne sont pas significativement différentes»?

Quand on m'a montré l'intrigue dans l'analyse en composantes principales etc. et que j'ai reçu l'explication que "la distribution de ces deux données n'est pas si différente", j'ai eu l'occasion de penser "Est-ce vraiment?", Alors j'ai essayé de produire des données qui ne le sont pas J'ai fait.

Créer des données

Créez deux types de données data1 et data2 constitués de trois dimensions x, y et z comme suit.

import numpy as np

x = np.random.normal(50,10, size=(500)) 
y = np.random.normal(50,10, size=(500)) 
z = np.random.normal(50, 1, size=(500))

x1 = x[np.where(z > 51, True, False)]
y1 = y[np.where(z > 51, True, False)]
z1 = z[np.where(z > 51, True, False)]

x2 = x[np.where(z < 49, True, False)]
y2 = y[np.where(z < 49, True, False)]
z2 = z[np.where(z < 49, True, False)]

data1 = np.concatenate([x1, y1, z1]).reshape(3, (len(x1))).transpose(1, 0)
data2 = np.concatenate([x2, y2, z2]).reshape(3, (len(x2))).transpose(1, 0)

data = np.concatenate([data1, data2])

colors = ["red" if i >len(data1) else "blue" for i in range(len(data1)+len(data2))]

Analyse des composants principaux

Après avoir analysé les principaux composants, "Hé, ces deux ensembles de données ne sont-ils pas significativement différents en termes de distribution?" (Visage de Doya)

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA #Analyseur de composants principaux

#Effectuer une analyse des composants principaux
pca = PCA()
pca.fit(data)
#Mappage des données sur l'espace des composants principaux=Compression de dimension
feature = pca.transform(data)
#Tracé avec les premier et deuxième composants principaux
plt.figure(figsize=(8, 8))
plt.scatter(feature[:len(data1), 0], feature[:len(data1), 1], alpha=0.8)
plt.scatter(feature[len(data1):, 0], feature[len(data1):, 1], alpha=0.8)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.grid()
plt.show()

output_3_0.png

Taux de cotisation cumulé

"Si c'est le cas, je vais vous montrer le taux de cotisation cumulé. Le taux de cotisation cumulé jusqu'à la deuxième composante principale (PC2) est proche de 100%, n'est-ce pas?"

#Illustrer le taux de cotisation cumulatif
import matplotlib.ticker as ticker
import numpy as np
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution ratio")
plt.grid()
plt.show()

output_5_0.png

Matrice de diagramme de dispersion

"Pouvez-vous me montrer la procession du nuage de points?"

(Dockin !!)

import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(feature, columns=['PC1', 'PC2', 'PC3']), figsize=(8, 8), color=colors) 
plt.show()

output_7_1.png

"N'est-ce pas une chose complètement différente?! Montrez-moi la matrice de diagramme de dispersion des données originales!"

"Susume Sumimen"

import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(data,  columns=['x', 'y', 'z']), figsize=(8, 8), color=colors) 
plt.show()

output_9_1.png

Standardisation des données

Vous devez regarder les données sous plusieurs angles. L'une des méthodes est la standardisation des données. Faire cela changera l'apparence des données.

import numpy as np
def zscore(x, axis = None):
    xmean = x.mean(axis=axis, keepdims=True)
    xstd  = np.std(x, axis=axis, keepdims=True)
    zscore = (x-xmean)/xstd
    return zscore
%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA #Analyseur de composants principaux

#Effectuer une analyse des composants principaux
pca = PCA()
pca.fit(zscore(data, axis=0))
#Mappage des données sur l'espace des composants principaux=Compression de dimension
feature = pca.transform(zscore(data, axis=0))
#Tracé avec les premier et deuxième composants principaux
plt.figure(figsize=(8, 8))
plt.scatter(feature[:len(data1), 0], feature[:len(data1), 1], alpha=0.8)
plt.scatter(feature[len(data1):, 0], feature[len(data1):, 1], alpha=0.8)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.grid()
plt.show()

output_12_0.png

#Illustrer le taux de cotisation cumulatif
import matplotlib.ticker as ticker
import numpy as np
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution ratio")
plt.grid()
plt.show()

output_13_0.png

import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(feature, columns=['PC1', 'PC2', 'PC3']), figsize=(8, 8), color=colors) 
plt.show()

output_14_1.png

import pandas as pd
from pandas.tools import plotting 
plotting.scatter_matrix(pd.DataFrame(zscore(data, axis=0),  columns=['x', 'y', 'z']), figsize=(8, 8), color=colors) 
plt.show()
/Users/kot/miniconda3/envs/py3new/lib/python3.6/site-packages/ipykernel_launcher.py:3: FutureWarning: 'pandas.tools.plotting.scatter_matrix' is deprecated, import 'pandas.plotting.scatter_matrix' instead.
  This is separate from the ipykernel package so we can avoid doing imports until

output_15_1.png

Recommended Posts

Quand on m'a montré un graphique comme l'analyse en composantes principales, «les distributions de ces deux données ne sont pas significativement différentes»?
[GWAS] Tracez les résultats de l'analyse en composantes principales (ACP) par PLINK