Cas liglab2 avec segmentation.

parent 2884a861
...@@ -2,14 +2,20 @@ ...@@ -2,14 +2,20 @@
"cells": [ "cells": [
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"# Sujet 4 : Estimation de la latence et de la capacité d’une connexion à partir de mesures asymétriques" "# Sujet 4 : Estimation de la latence et de la capacité d’une connexion à partir de mesures asymétriques"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On commence par déclarer les bibliothèques utilisés :\n", "On commence par déclarer les bibliothèques utilisés :\n",
"\n", "\n",
...@@ -19,7 +25,10 @@ ...@@ -19,7 +25,10 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 1,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [], "outputs": [],
"source": [ "source": [
"%matplotlib inline\n", "%matplotlib inline\n",
...@@ -36,14 +45,20 @@ ...@@ -36,14 +45,20 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"## Connexion courte à l'intérieur d'un campus" "## Connexion courte à l'intérieur d'un campus"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On commence par récupérer les données à étudier :" "On commence par récupérer les données à étudier :"
] ]
...@@ -51,7 +66,10 @@ ...@@ -51,7 +66,10 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 2,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
...@@ -87,7 +105,10 @@ ...@@ -87,7 +105,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On définit la fonction qui va lire chaque ligne pour en extraire les données. La ligne retournée sera formatée en CSV.\n", "On définit la fonction qui va lire chaque ligne pour en extraire les données. La ligne retournée sera formatée en CSV.\n",
"\n", "\n",
...@@ -99,7 +120,10 @@ ...@@ -99,7 +120,10 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 3,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
...@@ -137,7 +161,10 @@ ...@@ -137,7 +161,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"Lit les données du fichier, utilise la fonction `extractDataFromLine` définit précédemment pour extraire les données et les placer dans une variables `csv_data` qui contiendra les données au format CSV.\n", "Lit les données du fichier, utilise la fonction `extractDataFromLine` définit précédemment pour extraire les données et les placer dans une variables `csv_data` qui contiendra les données au format CSV.\n",
"\n", "\n",
...@@ -147,13 +174,16 @@ ...@@ -147,13 +174,16 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 4,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"Lu 44413 lignes en 0.189 sec\n" "Lu 44413 lignes en 0.196 sec\n"
] ]
} }
], ],
...@@ -177,7 +207,10 @@ ...@@ -177,7 +207,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"Traduit le tableau du format CSV en temps que DataFrame pandas. Comme on lit depuis le contenu d'une variable on utilise `io.StringIO` qui permet de lire une variable comme on lit un fichier." "Traduit le tableau du format CSV en temps que DataFrame pandas. Comme on lit depuis le contenu d'une variable on utilise `io.StringIO` qui permet de lire une variable comme on lit un fichier."
] ]
...@@ -185,7 +218,10 @@ ...@@ -185,7 +218,10 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": 5,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
...@@ -665,7 +701,10 @@ ...@@ -665,7 +701,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"### Premiers constats sur les données" "### Premiers constats sur les données"
] ]
...@@ -673,12 +712,15 @@ ...@@ -673,12 +712,15 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 6, "execution_count": 6,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fc560a1f128>" "<matplotlib.axes._subplots.AxesSubplot at 0x7f3c0b9d8160>"
] ]
}, },
"execution_count": 6, "execution_count": 6,
...@@ -704,7 +746,10 @@ ...@@ -704,7 +746,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On remarque quelques points avec une latence nettement plus importante que d'habitude.\n", "On remarque quelques points avec une latence nettement plus importante que d'habitude.\n",
"\n", "\n",
...@@ -714,12 +759,15 @@ ...@@ -714,12 +759,15 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 7,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fc55e9a3ac8>" "<matplotlib.axes._subplots.AxesSubplot at 0x7f3c09959c18>"
] ]
}, },
"execution_count": 7, "execution_count": 7,
...@@ -745,14 +793,20 @@ ...@@ -745,14 +793,20 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On remarque bien que la majorité des requêtes ont une réponse quasi immédiate. Beaucoup ont une réponse dans les 30 ms. Les durées de 70-80 ms semble être surprenamment courantes. Il n'y a que très peu de réponses dont la durée est supérieure à 90ms." "On remarque bien que la majorité des requêtes ont une réponse quasi immédiate. Beaucoup ont une réponse dans les 30 ms. Les durées de 70-80 ms semble être surprenamment courantes. Il n'y a que très peu de réponses dont la durée est supérieure à 90ms."
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"### Y a t'il une variabilité par heure ou par jour de la semaine ?\n", "### Y a t'il une variabilité par heure ou par jour de la semaine ?\n",
"\n", "\n",
...@@ -762,12 +816,16 @@ ...@@ -762,12 +816,16 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 8,
"metadata": {}, "metadata": {
"hideCode": false,
"hideOutput": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fc55e77ab38>" "<matplotlib.axes._subplots.AxesSubplot at 0x7f3c097366a0>"
] ]
}, },
"execution_count": 8, "execution_count": 8,
...@@ -799,7 +857,10 @@ ...@@ -799,7 +857,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"Il semblerait que seuls quelques heures dans l'après midi soit présentes. Les données ont été prises juste sur quelques heures ou plusieurs jours aux mêmes heures ? Il aurait fallu vérifier la durée des l'observation." "Il semblerait que seuls quelques heures dans l'après midi soit présentes. Les données ont été prises juste sur quelques heures ou plusieurs jours aux mêmes heures ? Il aurait fallu vérifier la durée des l'observation."
] ]
...@@ -807,7 +868,10 @@ ...@@ -807,7 +868,10 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 9,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
...@@ -825,14 +889,20 @@ ...@@ -825,14 +889,20 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"Les données ne sont présente que pour une petite tranche horaire durant une seule journée. Il s'agit d'un mardi donc jour ouvré mais je ne penses pas que l'on puisse faire des statistiques liés à la variation de charge réseau. Les données ne montrent pas de fortes variations qui pourrait être expliqué par un usage très différent du réseau à un moment donné." "Les données ne sont présente que pour une petite tranche horaire durant une seule journée. Il s'agit d'un mardi donc jour ouvré mais je ne penses pas que l'on puisse faire des statistiques liés à la variation de charge réseau. Les données ne montrent pas de fortes variations qui pourrait être expliqué par un usage très différent du réseau à un moment donné."
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"### Temps de transmission en fonction de la taille des messages et effet de la segmentation.\n", "### Temps de transmission en fonction de la taille des messages et effet de la segmentation.\n",
"\n", "\n",
...@@ -842,12 +912,15 @@ ...@@ -842,12 +912,15 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 10,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fc55e78f8d0>" "<matplotlib.axes._subplots.AxesSubplot at 0x7f3c097a3cc0>"
] ]
}, },
"execution_count": 10, "execution_count": 10,
...@@ -873,7 +946,10 @@ ...@@ -873,7 +946,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On voit bien les effets de la segmentation du paquet qui commence un peu avant 1500. C'est visiblement ce qui à été à l'origine de la bizarrerie que j'avais constaté et qui fait qu'il y a une augmentation du nombre de requêtes autour de 70~80 ms par rapport à des durées légèrement plus brèves.\n", "On voit bien les effets de la segmentation du paquet qui commence un peu avant 1500. C'est visiblement ce qui à été à l'origine de la bizarrerie que j'avais constaté et qui fait qu'il y a une augmentation du nombre de requêtes autour de 70~80 ms par rapport à des durées légèrement plus brèves.\n",
"\n", "\n",
...@@ -896,7 +972,10 @@ ...@@ -896,7 +972,10 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": 11,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
...@@ -1437,7 +1516,10 @@ ...@@ -1437,7 +1516,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On regarde les données sélectionnées sous forme de graphique :" "On regarde les données sélectionnées sous forme de graphique :"
] ]
...@@ -1445,12 +1527,15 @@ ...@@ -1445,12 +1527,15 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 12,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fc55e690160>" "<matplotlib.axes._subplots.AxesSubplot at 0x7f3c09644940>"
] ]
}, },
"execution_count": 12, "execution_count": 12,
...@@ -1476,20 +1561,26 @@ ...@@ -1476,20 +1561,26 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"Et l'histogramme de répartition des durées :" "Et l'histogramme de répartition des durées (attention échelle logarithmique) :"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 13, "execution_count": 13,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fc55e5a0278>" "<matplotlib.axes._subplots.AxesSubplot at 0x7f3c09534400>"
] ]
}, },
"execution_count": 13, "execution_count": 13,
...@@ -1515,7 +1606,10 @@ ...@@ -1515,7 +1606,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On remarque bien l'absence du pic vers 70~80 ms que l'on avait avant.\n", "On remarque bien l'absence du pic vers 70~80 ms que l'on avait avant.\n",
"\n", "\n",
...@@ -1525,7 +1619,10 @@ ...@@ -1525,7 +1619,10 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": 14,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"data": { "data": {
...@@ -1545,7 +1642,7 @@ ...@@ -1545,7 +1642,7 @@
" <th>Date:</th> <td>Fri, 12 Jun 2020</td> <th> Prob (F-statistic):</th> <td>0.000123</td> \n", " <th>Date:</th> <td>Fri, 12 Jun 2020</td> <th> Prob (F-statistic):</th> <td>0.000123</td> \n",
"</tr>\n", "</tr>\n",
"<tr>\n", "<tr>\n",
" <th>Time:</th> <td>14:48:52</td> <th> Log-Likelihood: </th> <td>-1.0715e+05</td>\n", " <th>Time:</th> <td>15:14:57</td> <th> Log-Likelihood: </th> <td>-1.0715e+05</td>\n",
"</tr>\n", "</tr>\n",
"<tr>\n", "<tr>\n",
" <th>No. Observations:</th> <td> 32667</td> <th> AIC: </th> <td>2.143e+05</td> \n", " <th>No. Observations:</th> <td> 32667</td> <th> AIC: </th> <td>2.143e+05</td> \n",
...@@ -1595,7 +1692,7 @@ ...@@ -1595,7 +1692,7 @@
"Model: OLS Adj. R-squared: 0.000\n", "Model: OLS Adj. R-squared: 0.000\n",
"Method: Least Squares F-statistic: 14.75\n", "Method: Least Squares F-statistic: 14.75\n",
"Date: Fri, 12 Jun 2020 Prob (F-statistic): 0.000123\n", "Date: Fri, 12 Jun 2020 Prob (F-statistic): 0.000123\n",
"Time: 14:48:52 Log-Likelihood: -1.0715e+05\n", "Time: 15:14:57 Log-Likelihood: -1.0715e+05\n",
"No. Observations: 32667 AIC: 2.143e+05\n", "No. Observations: 32667 AIC: 2.143e+05\n",
"Df Residuals: 32665 BIC: 2.143e+05\n", "Df Residuals: 32665 BIC: 2.143e+05\n",
"Df Model: 1 \n", "Df Model: 1 \n",
...@@ -1633,7 +1730,10 @@ ...@@ -1633,7 +1730,10 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"On regarde l'évolution de la durée en fonction de la taille du paquet (attention, échelle logarithmique) :" "On regarde l'évolution de la durée en fonction de la taille du paquet (attention, échelle logarithmique) :"
] ]
...@@ -1642,7 +1742,8 @@ ...@@ -1642,7 +1742,8 @@
"cell_type": "code", "cell_type": "code",
"execution_count": 15, "execution_count": 15,
"metadata": { "metadata": {
"scrolled": false "hideCode": false,
"hidePrompt": false
}, },
"outputs": [ "outputs": [
{ {
...@@ -1667,15 +1768,21 @@ ...@@ -1667,15 +1768,21 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"Cela semble être cohérant, calcule les paramètres L et C de la connection :" "Cela semble être cohérant, calcule les paramètres L et C de la connection :"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 17, "execution_count": 16,
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [ "outputs": [
{ {
"name": "stdout", "name": "stdout",
...@@ -1697,15 +1804,243 @@ ...@@ -1697,15 +1804,243 @@
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {
"hideCode": false,
"hidePrompt": false
},
"source": [ "source": [
"#### Cas avec segmentation (size > 1480) \n", "#### Cas avec segmentation (size > 1480) \n",
"\n", "\n",
"On sélectionne donc les entrées de plus de 1480 octets :" "On sélectionne donc les entrées de plus de 1480 octets et affiche l'histogramme de répartition des durées (attention échelle logarithmique) :"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"hideCode": false,
"hidePrompt": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f3c092db2b0>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"avec_frag = raw_data[raw_data['size'] > 1480]\n",
"avec_frag['time'].hist(log=True, bins=50)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le fameux pic vers 70~80 réapparait bien.\n",
"\n",
"Calcule la régression :"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table class=\"simpletable\">\n",
"<caption>OLS Regression Results</caption>\n",
"<tr>\n",
" <th>Dep. Variable:</th> <td>time</td> <th> R-squared: </th> <td> 0.000</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Model:</th> <td>OLS</td> <th> Adj. R-squared: </th> <td> 0.000</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Method:</th> <td>Least Squares</td> <th> F-statistic: </th> <td> 4.050</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Date:</th> <td>Fri, 12 Jun 2020</td> <th> Prob (F-statistic):</th> <td>0.0442</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Time:</th> <td>15:14:58</td> <th> Log-Likelihood: </th> <td> -50605.</td> \n",
"</tr>\n",
"<tr>\n",
" <th>No. Observations:</th> <td> 11369</td> <th> AIC: </th> <td>1.012e+05</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Residuals:</th> <td> 11367</td> <th> BIC: </th> <td>1.012e+05</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Model:</th> <td> 1</td> <th> </th> <td> </td> \n",
"</tr>\n",
"<tr>\n",
" <th>Covariance Type:</th> <td>nonrobust</td> <th> </th> <td> </td> \n",
"</tr>\n",
"</table>\n",
"<table class=\"simpletable\">\n",
"<tr>\n",
" <td></td> <th>coef</th> <th>std err</th> <th>t</th> <th>P>|t|</th> <th>[0.025</th> <th>0.975]</th> \n",
"</tr>\n",
"<tr>\n",
" <th>const</th> <td> 5.2898</td> <td> 2.244</td> <td> 2.357</td> <td> 0.018</td> <td> 0.891</td> <td> 9.689</td>\n",
"</tr>\n",
"<tr>\n",
" <th>size</th> <td> 0.0026</td> <td> 0.001</td> <td> 2.012</td> <td> 0.044</td> <td> 6.7e-05</td> <td> 0.005</td>\n",
"</tr>\n",
"</table>\n",
"<table class=\"simpletable\">\n",
"<tr>\n",
" <th>Omnibus:</th> <td>6230.343</td> <th> Durbin-Watson: </th> <td> 0.677</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Prob(Omnibus):</th> <td> 0.000</td> <th> Jarque-Bera (JB): </th> <td>33724.913</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Skew:</th> <td> 2.764</td> <th> Prob(JB): </th> <td> 0.00</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Kurtosis:</th> <td> 9.374</td> <th> Cond. No. </th> <td>2.02e+04</td> \n",
"</tr>\n",
"</table><br/><br/>Warnings:<br/>[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.<br/>[2] The condition number is large, 2.02e+04. This might indicate that there are<br/>strong multicollinearity or other numerical problems."
],
"text/plain": [
"<class 'statsmodels.iolib.summary.Summary'>\n",
"\"\"\"\n",
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: time R-squared: 0.000\n",
"Model: OLS Adj. R-squared: 0.000\n",
"Method: Least Squares F-statistic: 4.050\n",
"Date: Fri, 12 Jun 2020 Prob (F-statistic): 0.0442\n",
"Time: 15:14:58 Log-Likelihood: -50605.\n",
"No. Observations: 11369 AIC: 1.012e+05\n",
"Df Residuals: 11367 BIC: 1.012e+05\n",
"Df Model: 1 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [0.025 0.975]\n",
"------------------------------------------------------------------------------\n",
"const 5.2898 2.244 2.357 0.018 0.891 9.689\n",
"size 0.0026 0.001 2.012 0.044 6.7e-05 0.005\n",
"==============================================================================\n",
"Omnibus: 6230.343 Durbin-Watson: 0.677\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 33724.913\n",
"Skew: 2.764 Prob(JB): 0.00\n",
"Kurtosis: 9.374 Cond. No. 2.02e+04\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
"[2] The condition number is large, 2.02e+04. This might indicate that there are\n",
"strong multicollinearity or other numerical problems.\n",
"\"\"\""
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"size_stat = avec_frag['size']\n",
"size_stat = statsmodels.api.add_constant(size_stat)\n",
"model = statsmodels.api.OLS(avec_frag['time'], size_stat).fit()\n",
"model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On regarde l'évolution de la durée en fonction de la taille du paquet (attention, échelle logarithmique) :"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(avec_frag['size'], avec_frag['time'], marker=\".\")\n",
"plt.plot(avec_frag['size'], model.predict(), color='black')\n",
"plt.yscale('log')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cela semble être cohérant, calcule les paramètres L et C de la connection :"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"La latence est de L=0.005290s (soit 5.290ms)\n",
"La capacité est de C=387760 octets/s (soit 0.39 Mo/s ou 3.10 Mbps)\n"
]
}
],
"source": [
"print(\"La latence est de L=%fs (soit %.3fms)\" % (model.params.const / 1000, model.params.const))\n",
"\n",
"temps_en_ms_pour_1octet = model.params.tolist()[1]\n",
"temps_en_s_pour_1octet = temps_en_ms_pour_1octet / 1000.0\n",
"nombre_octets_dans_1s = 1.0 / temps_en_s_pour_1octet\n",
"print(\"La capacité est de C=%.0f octets/s (soit %.2f Mo/s ou %.2f Mbps)\" % (nombre_octets_dans_1s, nombre_octets_dans_1s / 1000000, nombre_octets_dans_1s / 1000000 * 8))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"C'est nettement moins performant !"
] ]
} }
], ],
"metadata": { "metadata": {
"celltoolbar": "Aucun(e)",
"hide_code_all_hidden": true,
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3",
"language": "python", "language": "python",
......
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