Commit 18988014 authored by Florent Chehab's avatar Florent Chehab
Browse files

Update

parent cadb1130
......@@ -86,6 +86,7 @@
"ALL_SEMESTERS = {info['sem']:info['end_date'] for info in CONFIGURATION[\"other_semesters\"]}\n",
"ALL_SEMESTERS[CONFIGURATION[\"main_semester\"]['sem']] = CONFIGURATION[\"main_semester\"]['end_date']\n",
"MAIN_SEMESTER = CONFIGURATION[\"main_semester\"]['sem']\n",
"OTHER_SEMESTERS = [d['sem'] for d in CONFIGURATION[\"other_semesters\"]]\n",
"ALL_SEMESTERS_SORTED = sorted(list(ALL_SEMESTERS.keys()), key=lambda sem:sem[1:5]+str((ord(sem[0]) + 20)%26 ))\n",
"\n",
"for semester in ALL_SEMESTERS.keys():\n",
......@@ -119,6 +120,21 @@
"EVALS_MAIN_SEM = EVALS[MAIN_SEMESTER]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"str_tmp = \"</br><center><span style='font-size:40px'>Semestre d'étude : \"\n",
"str_tmp += MAIN_SEMESTER\n",
"str_tmp += \"</span><br><br>\"\n",
"str_tmp += \"<span style='font-size:30px'>Autre(s) semestre(s) pour comparaison : \"\n",
"str_tmp += \" \".join(x for x in OTHER_SEMESTERS)\n",
"str_tmp += \"</span></center><br>\"\n",
"HTML(str_tmp)"
]
},
{
"cell_type": "markdown",
"metadata": {},
......@@ -176,9 +192,51 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Informations générales et analyse comparative\n",
"### Remarque\n",
"\n",
"Lorsque les statistiques des évaluations d'UVs (le nombre de `++`, de `+`, etc.) seront analysées de manière quantitative la table de conversion _symétrique_ suivante sera employée :\n",
"\n",
"| Sigle | Valeur associée |\n",
"|-------|-----------------|\n",
"| `++` | +3 |\n",
"| `+` | +1 |\n",
"| `-` | -1 |\n",
"| `--` | -3 |\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"POSSIBLE_ANSWERS = [\"--\",\"-\",\"+\",\"++\"]\n",
"POSSIBLE_ANSWERS_COEFFS = [-3,-1,1,3]\n",
"\n",
"def get_nb_evals(stats):\n",
" return sum([stats['1'][s] for s in POSSIBLE_ANSWERS])\n",
"\n",
"def get_mark_q(stat, q): \n",
" if type(q) is int:\n",
" q = str(q)\n",
" \n",
" return sum([stat[q][POSSIBLE_ANSWERS[i]] * POSSIBLE_ANSWERS_COEFFS[i] for i in range(len(POSSIBLE_ANSWERS_COEFFS))]) / get_nb_evals(stat)\n",
"\n",
"POSSIBLE_ANSWERS_COL = ['rgb(255,48,48)','rgb(255,165,0)', 'rgb(144,238,144)', 'rgb(48,221,48)']\n",
"ORANGE = 'rgb(255,126,24)'\n",
"\n",
"# Lets have some standard scales\n",
"SCALE_PERCENTAGE = [-1,101]\n",
"SCALE_MARK = [-3.1, 3.1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Informations générales\n",
"\n",
"L'analyse comparative se fait par rapport aux données des précédents semestres.\n",
"Lorsque'une analyse comparative est réalisée, elle est faite par rapport aux données des précédents semestres.\n",
"\n",
"### Taux de réponse"
]
......@@ -240,7 +298,7 @@
" barmode='group',\n",
" title = \"Taux de réponses aux évaluations\",\n",
" yaxis=dict(\n",
" range=[0, 100],\n",
" range=SCALE_PERCENTAGE,\n",
" title='Pourcentage',\n",
" ),\n",
")\n",
......@@ -270,7 +328,7 @@
"layout = go.Layout(\n",
" title = \"Taux de réponse moyen des étudiants aux évaluations\",\n",
" yaxis=dict(\n",
" range=[0, 100],\n",
" range=SCALE_PERCENTAGE,\n",
" title='Taux de réponse',\n",
" ),\n",
")\n",
......@@ -282,7 +340,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### Délai de réponse des responsables d'UVs"
"### Délai de réponse des responsables d'UVs\n",
"\n",
"#### Pour le semestre d'étude principal"
]
},
{
......@@ -296,13 +356,14 @@
" go.Scatter(\n",
" x=uvs_with_evals['date_review'].sort_values(),\n",
" y=[100*float(i+1)/nb_uvs for i,e in enumerate(uvs_with_evals.index)],\n",
" text=uvs_with_evals.sort_values(by=['date_review']).index\n",
" text=uvs_with_evals.sort_values(by=['date_review']).index,\n",
" marker=dict(color=ORANGE)\n",
" )\n",
"]\n",
"layout = go.Layout(\n",
" title = \"Délai de réponse\",\n",
" title = \"Délai de réponse des responsables d'UVs lors du semestre \"+MAIN_SEMESTER,\n",
" yaxis=dict(\n",
" range=[0, 100],\n",
" range=SCALE_PERCENTAGE,\n",
" title='Taux de réponse',\n",
" ),\n",
" xaxis=dict(\n",
......@@ -313,6 +374,27 @@
"iplot(go.Figure(data=graph_data, layout=layout))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### En comparaison avec les précédents semestres\n",
"\n",
"Pour cette comparaison, les dates sont renormalisées par rapport à la date correspondant au dernier jour des finaux du semestre en question. Les dates de fins des finaux sont les suivantes :"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"t = [[\"Semestre\", \"Date de la fin des finaux\"]]\n",
"for sem in ALL_SEMESTERS_SORTED:\n",
" t.append([sem, ALL_SEMESTERS[sem].strftime('%d/%m/%Y')]) \n",
"Markdown(to_mardown_table_str(t))"
]
},
{
"cell_type": "code",
"execution_count": null,
......@@ -339,7 +421,7 @@
"layout = go.Layout(\n",
" title = \"Délai de réponse\",\n",
" yaxis=dict(\n",
" range=[0, 100],\n",
" range=SCALE_PERCENTAGE,\n",
" title=\"Taux des resps. d'UVs qui ont 'vu' les évaluations\",\n",
" ),\n",
" xaxis=dict(\n",
......@@ -354,7 +436,24 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyse quantitative"
"# Analyse quantitative\n",
"\n",
"Pour rappel voici les questions posées :\n",
"\n",
"1. Clarté des objectifs et du programme de l'UV\n",
"2. Y a-t-il adéquation entre le programme annoncé et le programme réalisé ?\n",
"3. Ma maîtrise des antécédents et pré-requis nécessaires\n",
"4. Qualité pédagogique de l'équipe enseignante\n",
"5. Articulation et cohérence des activités\n",
"6. Qualité des supports pédagogiques\n",
"7. Adéquation des moyens matériels\n",
"8. Adéquation des contrôles et des évaluations\n",
"9. Quantité de travail demandée\n",
"10. Mon appréciation globale de l'UV\n",
"\n",
"## Vue d'ensemble des questions\n",
"\n",
"### Vue synthétique"
]
},
{
......@@ -363,35 +462,45 @@
"metadata": {},
"outputs": [],
"source": [
"def get_stats_uv_question(stats, question):\n",
"def get_stat_by_question(question, s):\n",
" q = str(question)\n",
" return stats[q][\"++\"], stats[q][\"+\"], stats[q][\"-\"], stats[q][\"--\"] \n",
" res = 0\n",
" for i, row in EVALS_MAIN_SEM.iterrows():\n",
" res += row[\"stats\"][q][s] / get_nb_evals(row[\"stats\"])\n",
" return res / len(EVALS_MAIN_SEM.index) * 100\n",
"\n",
"traces = []\n",
"for ans, col in zip(POSSIBLE_ANSWERS, POSSIBLE_ANSWERS_COL):\n",
" traces.append(\n",
" go.Bar(\n",
" x=[\"Question \"+str(i) for i in range(1,11)],\n",
" y=[get_stat_by_question(i, ans) for i in range(1,11)],\n",
" name=ans,\n",
" marker=dict(color=col)\n",
" )\n",
" )\n",
"\n",
"layout = go.Layout(\n",
" barmode='stack',\n",
" title=\"Pourcentage moyen de chaque type d'avis pour chaque question en \"+MAIN_SEMESTER,\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title=\"Pourcentage (cumulé)\",\n",
" ),\n",
")\n",
"\n",
"nb_pp, nb_p, nb_m, nb_mm = 0, 0, 0, 0\n",
"for i, row in EVALS_MAIN_SEM.iterrows():\n",
" for q in range(1,11):\n",
" a, b, c, d = get_stats_uv_question(row[\"stats\"],q)\n",
" nb_pp += a\n",
" nb_p += b\n",
" nb_m += c\n",
" nb_mm += d\n",
"\n",
"print(nb_pp, nb_p, nb_m, nb_mm)"
"fig = go.Figure(data=traces, layout=layout)\n",
"iplot(fig)"
]
},
{
"cell_type": "code",
"execution_count": null,
"cell_type": "markdown",
"metadata": {},
"outputs": [],
"source": [
"color_mm = 'rgb(255,48,48)'\n",
"color_m = 'rgb(255,165,0)'\n",
"color_p = 'rgb(144,238,144)'\n",
"color_pp = 'rgb(48,221,48)'\n",
"### Vue détaillée\n",
"\n",
"q_lists_pd = [str(i) for i in range(1,11)] # TODO BETTER"
"_Ici les évaluations (`++`, ...) sont converties en note numérique._"
]
},
{
......@@ -400,53 +509,96 @@
"metadata": {},
"outputs": [],
"source": [
"def get_stat_by_question(question, s = \"++\"):\n",
" q = str(question)\n",
" res = 0\n",
" for i, row in EVALS_MAIN_SEM.iterrows():\n",
" res += row[\"stats\"][q][s]\n",
" return res \n",
"traces = []\n",
"for q in [str(i) for i in range(1,11)]:\n",
" traces.append(\n",
" go.Box(\n",
" y=[get_mark_q(row[\"stats\"], q) for ind, row in EVALS_MAIN_SEM.iterrows()],\n",
" text=EVALS_MAIN_SEM.index,\n",
" name=\"Question \"+q,\n",
" )\n",
" )\n",
"\n",
"\n",
"layout = go.Layout(\n",
" title = \"Répartition des notes obetnues pour chaque question en \" + MAIN_SEMESTER,\n",
" yaxis=dict(\n",
" range=SCALE_MARK,\n",
" title='Notes obtenues',\n",
" ),\n",
")\n",
"\n",
"q_list = [\"q\"+str(i) for i in range(1,11)]\n",
"fig = go.Figure(data=traces, layout=layout)\n",
"iplot(fig)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Analyse de la question 10 (Appréciation globale de l'UV)\n",
"\n",
"### Analyse pour le semestre d'étude"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"Markdown(\"_(\"+MAIN_SEMESTER+\")_\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def get_stat_per_q(row, q, stat):\n",
" return row[\"stats\"][q][stat]\n",
" \n",
"def get_nb_mm_q10(row):\n",
" return get_stat_per_q(row, \"10\", \"--\")\n",
"\n",
"def get_nb_m_q10(row):\n",
" return get_stat_per_q(row, \"10\", \"-\")\n",
"\n",
"def get_nb_m_or_mm_q10(row):\n",
" return get_nb_mm_q10(row) + get_nb_m_q10(row)\n",
"\n",
"trace1 = go.Bar(\n",
" x=q_list,\n",
" y=[get_stat_by_question(i, \"--\") for i in range(1,11)],\n",
" name='--',\n",
" marker=dict(color=color_mm)\n",
")\n",
"trace2 = go.Bar(\n",
" x=q_list,\n",
" y=[get_stat_by_question(i, \"-\") for i in range(1,11)],\n",
" name='-',\n",
" marker=dict(color=color_m)\n",
")\n",
"trace3 = go.Bar(\n",
" x=q_list,\n",
" y=[get_stat_by_question(i, \"+\") for i in range(1,11)],\n",
" name='+',\n",
" marker=dict(color=color_p)\n",
"traces = []\n",
"tmp1 = EVALS_MAIN_SEM.apply(get_nb_mm_q10, axis=1) / EVALS_MAIN_SEM[\"nb_evals\"]\n",
"traces.append(\n",
" go.Scatter(\n",
" x=tmp1.sort_values().index,\n",
" y=tmp1.sort_values()*100,\n",
" name=\"--\"\n",
" ) \n",
")\n",
"trace4 = go.Bar(\n",
" x=q_list,\n",
" y=[get_stat_by_question(i, \"++\") for i in range(1,11)],\n",
" name='++',\n",
" marker=dict(color=color_pp)\n",
" \n",
"tmp2 = EVALS_MAIN_SEM.apply(get_nb_m_or_mm_q10, axis=1) / EVALS_MAIN_SEM[\"nb_evals\"]\n",
"traces.append(\n",
" go.Scatter(\n",
" x=tmp2[tmp1.sort_values().index].index,\n",
" y=tmp2[tmp1.sort_values().index]*100,\n",
" name=\"-- ou -\"\n",
" ) \n",
")\n",
"\n",
"data = [trace1, trace2, trace3, trace4]\n",
"layout = go.Layout(\n",
" barmode='stack',\n",
" title=\"Total cumulé de l'ensemble des évaluations d'UVs pour chaque question\"\n",
" title = \"Visualisation du pourcentage d'avis négatifs -- et (- ou --) pour la question 10\",\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title=\"Pourcentage\",\n",
" ),\n",
" xaxis=dict(\n",
" title=\"UVs triées selon le pourcentage d'avis -- à la question 10\",\n",
" )\n",
")\n",
"\n",
"\n",
"fig = go.Figure(data=data, layout=layout)\n",
"iplot(fig)"
"iplot(go.Figure(data=traces, layout=layout))"
]
},
{
......@@ -455,33 +607,24 @@
"metadata": {},
"outputs": [],
"source": [
"def get_mm_per_row(row, relative = True):\n",
" nb_mm = 0\n",
" # for q in q_lists_pd :\n",
" # nb_mm += row[\"stats\"][q][\"--\"]\n",
" \n",
" nb_mm = row[\"stats\"][\"10\"][\"--\"]\n",
" \n",
" if relative:\n",
" nb_eval = sum([row[\"stats\"][\"1\"][i] for i in [\"--\",\"-\",\"+\",\"++\"] ])\n",
" # return nb_mm / float(nb_eval*len(q_list))\n",
" return nb_mm / float(nb_eval)\n",
" else :\n",
" return nb_mm\n",
" \n",
"tmp = EVALS_MAIN_SEM.apply(get_mm_per_row, axis=1)\n",
"tmp = EVALS_MAIN_SEM.apply((lambda r : get_mark_q(r[\"stats\"],10)), axis=1)\n",
"\n",
"graph_data = [\n",
" go.Scatter(\n",
" x=tmp.sort_values().index,\n",
" y=tmp.sort_values(),\n",
" x=tmp.sort_values(ascending = False).index,\n",
" y=tmp.sort_values(ascending = False),\n",
" marker=dict(color=ORANGE)\n",
" )\n",
"]\n",
"\n",
"layout = go.Layout(\n",
" title=\"Pourcentage d'avis très négatif (--) sur l'appréciation finale de l'UV (question 10 des évaluations)\"\n",
" title=\"Visualisation de l'appréciation globale de chaque UV (question 10) sous forme de note moyenne\",\n",
" yaxis=dict(\n",
" range=SCALE_MARK,\n",
" title=\"Pourcentage\",\n",
" ),\n",
")\n",
"\n",
"\n",
"fig = go.Figure(data=graph_data, layout=layout)\n",
"iplot(fig)"
]
......@@ -490,34 +633,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Remarques\n",
"\n",
"Pour la suite de l'analyse il est plus simple d'affecter une note numérique à chaque évaluation. Pour se faire il a été décidé d'utiliser la table de conversion _symétrique_ suivante :\n",
"\n",
"| Sigle | Valeur associée |\n",
"|-------|-----------------|\n",
"| ++ | +3 |\n",
"| + | +1 |\n",
"| - | -1 |\n",
"| -- | -3 |\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"list_answers = [\"--\",\"-\",\"+\",\"++\"]\n",
"list_coeffs = [-3,-1,1,3]\n",
"\n",
"def get_nb_eval(row):\n",
" return sum([row[\"stats\"][\"1\"][i] for i in list_answers])\n",
"\n",
"def get_mark_q(row, q): \n",
" if type(q) is int:\n",
" q = str(q)\n",
" return sum([row[\"stats\"][q][list_answers[i]] * list_coeffs[i] for i in range(len(list_coeffs))]) / get_nb_eval(row)"
"### Comparaison avec les précédents semestres"
]
},
{
......@@ -526,20 +642,46 @@
"metadata": {},
"outputs": [],
"source": [
"tmp = EVALS_MAIN_SEM.apply((lambda r : get_mark_q(r,10)), axis=1)\n",
"q10_main_sem = EVALS_MAIN_SEM.apply((lambda r : get_mark_q(r[\"stats\"],10)), axis=1).\\\n",
" sort_values(ascending = False)\n",
"traces = []\n",
"\n",
"graph_data = [\n",
" go.Scatter(\n",
" x=tmp.sort_values(ascending = False).index,\n",
" y=tmp.sort_values(ascending = False),\n",
"for sem in OTHER_SEMESTERS:\n",
" tmp = []\n",
" eval_sem = EVALS[sem]\n",
" for uv in q10_main_sem.index:\n",
" if uv in eval_sem.index:\n",
" row = eval_sem[eval_sem.index==uv]\n",
" tmp.append(get_mark_q(row[\"stats\"][uv],10))\n",
" else:\n",
" tmp.append(np.nan)\n",
" \n",
" traces.append(\n",
" go.Scatter(\n",
" x=q10_main_sem.index,\n",
" y=tmp,\n",
" name=sem,\n",
" mode = 'markers',\n",
" )\n",
" )\n",
"]\n",
"\n",
"traces.append(\n",
"go.Scatter(\n",
" x=q10_main_sem.index,\n",
" y=q10_main_sem,\n",
" name=MAIN_SEMESTER\n",
" )\n",
")\n",
" \n",
"layout = go.Layout(\n",
" title=\"Visualisation de l'appréciation globale de chaque UV (question 10) sous forme de note moyenne\"\n",
" title=\"Visualisation de l'appréciation globale de chaque UV (question 10) sous forme de note moyenne\",\n",
" yaxis=dict(\n",
" range=SCALE_MARK,\n",
" title=\"Pourcentage\",\n",
" ),\n",
")\n",
"\n",
"fig = go.Figure(data=graph_data, layout=layout)\n",
"fig = go.Figure(data=traces, layout=layout)\n",
"iplot(fig)"
]
},
......@@ -555,13 +697,6 @@
"style = open('./src/style.css').read()\n",
"HTML(\"<style>\"+style+\"</style>\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment