9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
Agrupamiento K Means: Ejercicio Propuesto
Para este proyecto intentaremos utilizar Agrupamiento K Means para agrupar Universidades en
dos grupos, Privado y Público.
Es muy importante tener en cuenta que, de hecho, tenemos las etiquetas para este conjunto
de datos, pero NO los utilizaremos para el algoritmo de agrupamiento de KMeans, ya que es
un algoritmo de aprendizaje no supervisado.
Cuando se utiliza el algoritmo Kmeans en circunstancias normales, es porque no tiene etiquetas.
En este caso usaremos las etiquetas para tratar de tener una idea de qué tan bien funcionó el
algoritmo, pero generalmente no se tienen estas para Kmeans, por lo que el informe de
clasificación y la matriz de confusión al final de este proyecto no se hacen realmente. ¡tiene sentido
en un entorno real!
Los Datos
Utilizaremos un dataframe con 777 observaciones sobre las siguientes 18 variables.
Private Un factor con niveles No y Yes que indica universidad privada o pública
Apps Número de solicitudes recibidas
Accept Número de aplicaciones aceptadas
Enroll Número de nuevos estudiantes matriculados
Top10perc Pct. nuevos estudiantes del 10% superior de H.S.
Top25perc Pct. nuevos estudiantes del 25% superior de H.S.
[Link] Número de estudiantes a tiempo completo
[Link] Número de estudiantes a tiempo parcial
Outstate Matrícula fuera del estado
[Link] Costos de habitación y comida
Books Costos estimados del libro
Personal Gasto personal estimado
PhD Pct. de la facultad con Ph.D.
Terminal Pct. de la facultad con grado terminal
[Link] Proporción estudiante / facultad
[Link] Pct. ex alumnos que donan
Expend Gastos de instrucción por estudiante
[Link] Tasa de graduación
Importar librerias
** Importe las librerias que generalmente usa para el análisis de datos. **
[Link] 1/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [1]: import pandas as pd
import numpy as np
import [Link] as plt
import seaborn as sns
%matplotlib inline
Obtener los Datos
In [ ]:
** Lea en el archivo College_Data usando read_csv. Configure la primera columna como índice.**
In [2]: df = pd.read_csv('College_Data',index_col=0)
Revise los primeros registros de los datos
In [3]: [Link]()
Out[3]:
Private Apps Accept Enroll Top10perc Top25perc [Link] [Link] Outsta
Abilene
Christian Yes 1660 1232 721 23 52 2885 537 74
University
Adelphi
Yes 2186 1924 512 16 29 2683 1227 122
University
Adrian
Yes 1428 1097 336 22 50 1036 99 112
College
Agnes
Scott Yes 417 349 137 60 89 510 63 129
College
Alaska
Pacific Yes 193 146 55 16 44 249 869 75
University
** Aplique los métodos info() y describe() en los datos.**
[Link] 2/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [4]: [Link]()
<class '[Link]'>
Index: 777 entries, Abilene Christian University to York College of Pennsylvan
ia
Data columns (total 18 columns):
Private 777 non-null object
Apps 777 non-null int64
Accept 777 non-null int64
Enroll 777 non-null int64
Top10perc 777 non-null int64
Top25perc 777 non-null int64
[Link] 777 non-null int64
[Link] 777 non-null int64
Outstate 777 non-null int64
[Link] 777 non-null int64
Books 777 non-null int64
Personal 777 non-null int64
PhD 777 non-null int64
Terminal 777 non-null int64
[Link] 777 non-null float64
[Link] 777 non-null int64
Expend 777 non-null int64
[Link] 777 non-null int64
dtypes: float64(1), int64(16), object(1)
memory usage: 115.3+ KB
In [5]: [Link]()
Out[5]:
Apps Accept Enroll Top10perc Top25perc [Link] [Link]
count 777.000000 777.000000 777.000000 777.000000 777.000000 777.000000 777.00000
mean 3001.638353 2018.804376 779.972973 27.558559 55.796654 3699.907336 855.29858
std 3870.201484 2451.113971 929.176190 17.640364 19.804778 4850.420531 1522.43188
min 81.000000 72.000000 35.000000 1.000000 9.000000 139.000000 1.00000
25% 776.000000 604.000000 242.000000 15.000000 41.000000 992.000000 95.00000
50% 1558.000000 1110.000000 434.000000 23.000000 54.000000 1707.000000 353.00000
75% 3624.000000 2424.000000 902.000000 35.000000 69.000000 4005.000000 967.00000
max 48094.000000 26330.000000 6392.000000 96.000000 100.000000 31643.000000 21836.00000
Análisis Exploratorio de Datos
¡Es hora de crear algunas visualizaciones de datos!
** Crea un diagrama de dispersión de [Link] vs [Link] donde los puntos están
coloreados por la columna Private. **
[Link] 3/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [6]: sns.set_style('whitegrid')
[Link]('[Link]','[Link]',data=df,hue='Private',
palette='coolwarm',size=6,aspect=1,fit_reg=False)
C:\CursoML\lib\site-packages\seaborn\[Link]: UserWarning: The `size
` paramter has been renamed to `height`; please update your code.
[Link](msg, UserWarning)
Out[6]: <[Link] at 0x6a8a5f8>
Crea un diagrama de dispersión de [Link] vs Outstate donde los puntos están
coloreados por la columna Private.
[Link] 4/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [7]: sns.set_style('whitegrid')
[Link]('Outstate','[Link]',data=df,hue='Private',
palette='coolwarm',size=6,aspect=1,fit_reg=False)
C:\CursoML\lib\site-packages\seaborn\[Link]: UserWarning: The `size
` paramter has been renamed to `height`; please update your code.
[Link](msg, UserWarning)
Out[7]: <[Link] at 0x4f726a0>
** Cree un histograma apilado que muestre la matrícula fuera del estado según la columna Private.
Intente hacerlo usando [Link]
([Link] Si eso es
demasiado complicado, vea si puede hacerlo simplemente usando dos instancias de
[Link](kind='hist'). **
[Link] 5/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [8]: sns.set_style('darkgrid')
g = [Link](df,hue='Private',palette='coolwarm',
size=4,aspect=2)
g = [Link]([Link],'Outstate',bins=20,alpha=0.7)
[Link]()
C:\CursoML\lib\site-packages\seaborn\[Link]: UserWarning: The `size`
paramter has been renamed to `height`; please update your code.
[Link](msg, UserWarning)
Out[8]: <[Link] at 0x6ba2ef0>
Create un histograma similar para la columna [Link].
[Link] 6/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [9]: sns.set_style('darkgrid')
g = [Link](df,hue='Private',palette='coolwarm',
size=4,aspect=2)
g = [Link]([Link],'[Link]',bins=20,alpha=0.7)
[Link]()
C:\CursoML\lib\site-packages\seaborn\[Link]: UserWarning: The `size`
paramter has been renamed to `height`; please update your code.
[Link](msg, UserWarning)
Out[9]: <[Link] at 0x6a8e8d0>
** Observe cómo parece haber una escuela privada con una tasa de graduación superior al 100%.
¿Cuál es el nombre de esa escuela?**
In [10]: df[df['[Link]']>100]
Out[10]:
Private Apps Accept Enroll Top10perc Top25perc [Link] [Link] Outsta
Cazenovia
Yes 3847 3433 527 9 35 1010 12 93
College
** Establezca la tasa de graduación de esa escuela en 100, de modo que tenga sentido. Puede
obtener una advertencia, no un error, al realizar esta operación, por lo tanto, utilice las operaciones
de dataframe o simplemente vuelva a hacer la visualización del histograma para asegurarse de que
realmente se realizó. **
[Link] 7/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [11]: df['[Link]']['Cazenovia College']=100
C:\CursoML\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: [Link]
ble/[Link]#indexing-view-versus-copy ([Link]
ocs/stable/[Link]#indexing-view-versus-copy)
"""Entry point for launching an IPython kernel.
In [12]: df[df['[Link]']>100]
Out[12]:
Private Apps Accept Enroll Top10perc Top25perc [Link] [Link] Outstate Room
In [13]: sns.set_style('darkgrid')
g = [Link](df,hue='Private',palette='coolwarm',
size=4,aspect=2)
g = [Link]([Link],'[Link]',bins=20,alpha=0.7)
[Link]()
C:\CursoML\lib\site-packages\seaborn\[Link]: UserWarning: The `size`
paramter has been renamed to `height`; please update your code.
[Link](msg, UserWarning)
Out[13]: <[Link] at 0x6a918d0>
Creación del clúster K Means
¡Ahora es el momento de crear las etiquetas del Cluster!
** Importar KMeans de SciKit Learn. **
In [14]: from [Link] import KMeans
[Link] 8/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
** Crea una instancia de un modelo de KM eans con 2 clústeres. **
In [15]: kmeans = KMeans(n_clusters=2)
** Ajuste el modelo a todos los datos a excepción de la etiqueta Private. **
In [16]: [Link]([Link]('Private',axis=1))
Out[16]: KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=2, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
** ¿Cuáles son los centro del grupo de los vectores? **
In [17]: kmeans.cluster_centers_
Out[17]: array([[1.81323468e+03, 1.28716592e+03, 4.91044843e+02, 2.53094170e+01,
5.34708520e+01, 2.18854858e+03, 5.95458894e+02, 1.03957085e+04,
4.31136472e+03, 5.41982063e+02, 1.28033632e+03, 7.04424514e+01,
7.78251121e+01, 1.40997010e+01, 2.31748879e+01, 8.93204634e+03,
6.50926756e+01],
[1.03631389e+04, 6.55089815e+03, 2.56972222e+03, 4.14907407e+01,
7.02037037e+01, 1.30619352e+04, 2.46486111e+03, 1.07191759e+04,
4.64347222e+03, 5.95212963e+02, 1.71420370e+03, 8.63981481e+01,
9.13333333e+01, 1.40277778e+01, 2.00740741e+01, 1.41705000e+04,
6.75925926e+01]])
Evaluación
No existe una forma perfecta de evaluar la agrupación si no se cuenta con las etiquetas, sin
embargo, dado que se trata de un ejercicio y sí tenemos las etiquetas, por lo que aprovechamos
esto para evaluar nuestros grupos, tenga en cuenta que generalmente no es así en el mundo real.
** Cree una nueva columna para df llamada 'Cluster', que es un 1 para una escuela privada y un 0
para una escuela pública. **
In [20]: def conversor(cluster):
if cluster == 'Yes':
return 1
else:
return 0
In [21]: df['Cluster']=df['Private'].apply(conversor)
[Link] 9/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [22]: [Link]()
Out[22]:
Private Apps Accept Enroll Top10perc Top25perc [Link] [Link] Outsta
Abilene
Christian Yes 1660 1232 721 23 52 2885 537 74
University
Adelphi
Yes 2186 1924 512 16 29 2683 1227 122
University
Adrian
Yes 1428 1097 336 22 50 1036 99 112
College
Agnes
Scott Yes 417 349 137 60 89 510 63 129
College
Alaska
Pacific Yes 193 146 55 16 44 249 869 75
University
** Cree una matriz de confusión y un informe de clasificación para ver qué tan bien funcionó el
clúster de K Means sin etiquetas. **
In [23]: from [Link] import confusion_matrix
from [Link] import classification_report
print(confusion_matrix(df['Cluster'],kmeans.labels_))
print(classification_report(df['Cluster'],kmeans.labels_))
[[138 74]
[531 34]]
precision recall f1-score support
0 0.21 0.65 0.31 212
1 0.31 0.06 0.10 565
avg / total 0.29 0.22 0.16 777
[Link] 10/11
9/12/2018 02 Agrupamiento K Means Ejercicio Propuesto
In [24]: kmeans.labels_
Out[24]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0,
0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0,
0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1,
0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0,
1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,
0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0])
¡No está mal teniendo en cuenta que el algoritmo está utilizando puramente las características para
agrupar las universidades en 2 grupos distintos! ¡Con suerte, puede comenzar a ver cómo K Means
es útil para agrupar datos no etiquetados!
Great Job!
[Link] 11/11