{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from sklearn.metrics import silhouette_score\n", "from sklearn import preprocessing\n", "from sklearn.cluster import AgglomerativeClustering\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import math" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "#ucitavanje skupa\n", "df = pd.read_csv(\"C:/Users/student/Desktop/ipVezbe122021/primeri/studenti.csv\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
INDEKSSMERDUZINA_STUDIRANJAPOLOZENO_ISPITAPROSEK
020060018Profesor matematike i racunarstva4387.60
120060019Numericka matematika i optimizacija4409.55
220060020Profesor matematike i racunarstva6386.89
320060022Profesor matematike i racunarstva4388.57
420060026Racunarstvo i informatika4399.87
..................
43620090217Matematika4438.72
43720090272Matematika4427.69
43820090339Informatika4297.06
43920090340Racunarstvo i informatika3406.80
44020090345Racunarstvo i informatika3407.35
\n", "

441 rows × 5 columns

\n", "
" ], "text/plain": [ " INDEKS SMER DUZINA_STUDIRANJA \\\n", "0 20060018 Profesor matematike i racunarstva 4 \n", "1 20060019 Numericka matematika i optimizacija 4 \n", "2 20060020 Profesor matematike i racunarstva 6 \n", "3 20060022 Profesor matematike i racunarstva 4 \n", "4 20060026 Racunarstvo i informatika 4 \n", ".. ... ... ... \n", "436 20090217 Matematika 4 \n", "437 20090272 Matematika 4 \n", "438 20090339 Informatika 4 \n", "439 20090340 Racunarstvo i informatika 3 \n", "440 20090345 Racunarstvo i informatika 3 \n", "\n", " POLOZENO_ISPITA PROSEK \n", "0 38 7.60 \n", "1 40 9.55 \n", "2 38 6.89 \n", "3 38 8.57 \n", "4 39 9.87 \n", ".. ... ... \n", "436 43 8.72 \n", "437 42 7.69 \n", "438 29 7.06 \n", "439 40 6.80 \n", "440 40 7.35 \n", "\n", "[441 rows x 5 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Kolone za klasterovanje ['SMER', 'DUZINA_STUDIRANJA', 'POLOZENO_ISPITA', 'PROSEK']\n", "Kolone nakon izvrsene binarizacije \n", "['DUZINA_STUDIRANJA', 'POLOZENO_ISPITA', 'PROSEK', 'SMER_Astrofizika', 'SMER_Astronomija i astrofizika', 'SMER_Informatika', 'SMER_Matematika', 'SMER_Numericka matematika i optimizacija', 'SMER_Profesor matematike i racunarstva', 'SMER_Racunarstvo i informatika', 'SMER_Statistika, aktuarska i finansijska matematika', 'SMER_Teorijska matematika i primene']\n" ] } ], "source": [ "#Atribut INDEKS nece biti koriscen pri klasterovanju jer je jedinstven za svakog studenta.\n", "use_columns = df.columns[1:]\n", "print('Kolone za klasterovanje', use_columns.tolist())\n", "\n", "#Za klasterovanje se koriste 3 numericka i 1 kategoricki atribut.\n", "# Da bi kategoricki atribut mogao da se koristi u klasterovanju\n", "# mora biti pretvoren u jedan ili vise numerickih atributa, te ce nad\n", "# njim biti izvrsena binarizacija.\n", "# Funkcija pd.get_dummies vrsi binarizaciju nad svim nenumerickim atributima u objektu klase DataFrame.\n", "# Svaki novi atribut dobijen binarizacijom kategorickog atributa kao prefiks ima ime\n", "# originalnog atributa na osnovu koga je nastao.\n", "df_trans=pd.get_dummies(df[use_columns])\n", "\n", "print('Kolone nakon izvrsene binarizacije ')\n", "print(df_trans.columns.tolist())\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "#normalizacija atributa\n", "x = pd.DataFrame(preprocessing.MinMaxScaler().fit_transform(df_trans), columns = df_trans.columns)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Pri hijerarhijskom klasterovanju bice korisceno euklidsko rastojanje,\n", "# pa ce vrednost 1 u atributima dobijenim na osnovu kategorickog atributa SMER\n", "# biti zamenjena sa sqrt(0.5), da bi svi originalni atributi imali isti uticaj\n", "# pri klasterovanju.\n", "dummy_cols = [col for col in x.columns.tolist() if col.startswith('SMER')]\n", "for col in dummy_cols:\n", " x[col].replace(1, math.sqrt(0.5), inplace=True )\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DUZINA_STUDIRANJAPOLOZENO_ISPITAPROSEKSMER_AstrofizikaSMER_Astronomija i astrofizikaSMER_InformatikaSMER_MatematikaSMER_Numericka matematika i optimizacijaSMER_Profesor matematike i racunarstvaSMER_Racunarstvo i informatikaSMER_Statistika, aktuarska i finansijska matematikaSMER_Teorijska matematika i primene
00.2500000.6666670.3406590.00.00.0000000.0000000.0000000.7071070.0000000.00.0
10.2500000.7777780.8763740.00.00.0000000.0000000.7071070.0000000.0000000.00.0
20.4166670.6666670.1456040.00.00.0000000.0000000.0000000.7071070.0000000.00.0
30.2500000.6666670.6071430.00.00.0000000.0000000.0000000.7071070.0000000.00.0
40.2500000.7222220.9642860.00.00.0000000.0000000.0000000.0000000.7071070.00.0
.......................................
4360.2500000.9444440.6483520.00.00.0000000.7071070.0000000.0000000.0000000.00.0
4370.2500000.8888890.3653850.00.00.0000000.7071070.0000000.0000000.0000000.00.0
4380.2500000.1666670.1923080.00.00.7071070.0000000.0000000.0000000.0000000.00.0
4390.1666670.7777780.1208790.00.00.0000000.0000000.0000000.0000000.7071070.00.0
4400.1666670.7777780.2719780.00.00.0000000.0000000.0000000.0000000.7071070.00.0
\n", "

441 rows × 12 columns

\n", "
" ], "text/plain": [ " DUZINA_STUDIRANJA POLOZENO_ISPITA PROSEK SMER_Astrofizika \\\n", "0 0.250000 0.666667 0.340659 0.0 \n", "1 0.250000 0.777778 0.876374 0.0 \n", "2 0.416667 0.666667 0.145604 0.0 \n", "3 0.250000 0.666667 0.607143 0.0 \n", "4 0.250000 0.722222 0.964286 0.0 \n", ".. ... ... ... ... \n", "436 0.250000 0.944444 0.648352 0.0 \n", "437 0.250000 0.888889 0.365385 0.0 \n", "438 0.250000 0.166667 0.192308 0.0 \n", "439 0.166667 0.777778 0.120879 0.0 \n", "440 0.166667 0.777778 0.271978 0.0 \n", "\n", " SMER_Astronomija i astrofizika SMER_Informatika SMER_Matematika \\\n", "0 0.0 0.000000 0.000000 \n", "1 0.0 0.000000 0.000000 \n", "2 0.0 0.000000 0.000000 \n", "3 0.0 0.000000 0.000000 \n", "4 0.0 0.000000 0.000000 \n", ".. ... ... ... \n", "436 0.0 0.000000 0.707107 \n", "437 0.0 0.000000 0.707107 \n", "438 0.0 0.707107 0.000000 \n", "439 0.0 0.000000 0.000000 \n", "440 0.0 0.000000 0.000000 \n", "\n", " SMER_Numericka matematika i optimizacija \\\n", "0 0.000000 \n", "1 0.707107 \n", "2 0.000000 \n", "3 0.000000 \n", "4 0.000000 \n", ".. ... \n", "436 0.000000 \n", "437 0.000000 \n", "438 0.000000 \n", "439 0.000000 \n", "440 0.000000 \n", "\n", " SMER_Profesor matematike i racunarstva SMER_Racunarstvo i informatika \\\n", "0 0.707107 0.000000 \n", "1 0.000000 0.000000 \n", "2 0.707107 0.000000 \n", "3 0.707107 0.000000 \n", "4 0.000000 0.707107 \n", ".. ... ... \n", "436 0.000000 0.000000 \n", "437 0.000000 0.000000 \n", "438 0.000000 0.000000 \n", "439 0.000000 0.707107 \n", "440 0.000000 0.707107 \n", "\n", " SMER_Statistika, aktuarska i finansijska matematika \\\n", "0 0.0 \n", "1 0.0 \n", "2 0.0 \n", "3 0.0 \n", "4 0.0 \n", ".. ... \n", "436 0.0 \n", "437 0.0 \n", "438 0.0 \n", "439 0.0 \n", "440 0.0 \n", "\n", " SMER_Teorijska matematika i primene \n", "0 0.0 \n", "1 0.0 \n", "2 0.0 \n", "3 0.0 \n", "4 0.0 \n", ".. ... \n", "436 0.0 \n", "437 0.0 \n", "438 0.0 \n", "439 0.0 \n", "440 0.0 \n", "\n", "[441 rows x 12 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# primena hijerarhijskog sakupljajuceg klasterovanja za razlicite veze i broj klastera\n", "for link in ['complete', 'average', 'single']:\n", "\n", " # recnik koji ce sadrzati silueta koeficijent za razlicit broj izdvojenih klastera\n", " silhouette_scores = {'clusters': [], 'score': []}\n", "\n", " for i in range(2,36):\n", " # primena algoritma za i klastera\n", " est = AgglomerativeClustering(n_clusters=i, linkage=link)\n", " est.fit(x)\n", "\n", " #cuvanje podataka o broju klastera i silueta koeficijentu za izvrseno klasterovanje\n", " #radi grafickog prikaza\n", " silhouette_scores['clusters'].append(i)\n", " silhouette_scores['score'].append(silhouette_score(x, est.labels_))\n", "\n", " # prikaz rezultata klasterovanja pomocu grafika broj klastera - senka koeficijent\n", " # za vezu koriscenu pri hijerarhijskom klasterovanju\n", " plt.plot(silhouette_scores['clusters'], silhouette_scores['score'], marker='o', label=link)\n", "\n", " #izdvajanje optimalnog broja klastera sa zadatim parametrima pri klasterovanju\n", " # na osnovu silueta koeficijenta\n", " best_num_clusters = silhouette_scores['clusters'][np.argmax(silhouette_scores['score'])]\n", "\n", " print('#######################################################################')\n", " print('Veza', link, 'broj klastera sa najvecim senka koeficijentom', best_num_clusters)\n", " \n", " #primena klasterovanja sa optimalnim brojem klastera da bi se\n", " #izdvojile deskriptivne statistike za svaki klaster\n", " est = AgglomerativeClustering(n_clusters=i, linkage=link)\n", " est.fit(x)\n", " df['label']=est.labels_\n", "\n", " #racuanje i prikaz deskriptivnih statistika za svaki izdvojeni klaster\n", " for j in range(0, best_num_clusters):\n", " cluster = df.loc[df['label'] == j, :]\n", " print('***********************************************************')\n", " print('Klaster', j)\n", " print(cluster.describe(include='all'))\n", "\n", "# postavljanje teksta za x i y osu\n", "plt.xlabel('Broj klastera')\n", "plt.ylabel('Silueta koeficijent')\n", "\n", "# prikaz legende na slici\n", "plt.legend()\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "#Na osnovu dobijene slike, vidi se da je za sve tri primenjene veze za odredjivanje\n", "# bliskosti dva klastera pri hijerarhijskom klasterovanju, optimalan broj klastera 9 ili 10.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 2 }