Last active
December 12, 2017 01:53
-
-
Save shahril96/4736a8e3020ed2e3ba6d7cd1339b88ea to your computer and use it in GitHub Desktop.
FIFA'17 dataset analysis
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Load all important modules" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 158, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<br>\n", | |
"# Load data from CSV file" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 159, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style>\n", | |
" .dataframe thead tr:only-child th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: left;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Name</th>\n", | |
" <th>Nationality</th>\n", | |
" <th>National_Position</th>\n", | |
" <th>National_Kit</th>\n", | |
" <th>Club</th>\n", | |
" <th>Club_Position</th>\n", | |
" <th>Club_Kit</th>\n", | |
" <th>Club_Joining</th>\n", | |
" <th>Contract_Expiry</th>\n", | |
" <th>Rating</th>\n", | |
" <th>...</th>\n", | |
" <th>Long_Shots</th>\n", | |
" <th>Curve</th>\n", | |
" <th>Freekick_Accuracy</th>\n", | |
" <th>Penalties</th>\n", | |
" <th>Volleys</th>\n", | |
" <th>GK_Positioning</th>\n", | |
" <th>GK_Diving</th>\n", | |
" <th>GK_Kicking</th>\n", | |
" <th>GK_Handling</th>\n", | |
" <th>GK_Reflexes</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Cristiano Ronaldo</td>\n", | |
" <td>Portugal</td>\n", | |
" <td>LS</td>\n", | |
" <td>7.0</td>\n", | |
" <td>Real Madrid</td>\n", | |
" <td>LW</td>\n", | |
" <td>7.0</td>\n", | |
" <td>7/1/2009</td>\n", | |
" <td>2021.0</td>\n", | |
" <td>94</td>\n", | |
" <td>...</td>\n", | |
" <td>90</td>\n", | |
" <td>81</td>\n", | |
" <td>76</td>\n", | |
" <td>85</td>\n", | |
" <td>88</td>\n", | |
" <td>14</td>\n", | |
" <td>7</td>\n", | |
" <td>15</td>\n", | |
" <td>11</td>\n", | |
" <td>11</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>Lionel Messi</td>\n", | |
" <td>Argentina</td>\n", | |
" <td>RW</td>\n", | |
" <td>10.0</td>\n", | |
" <td>FC Barcelona</td>\n", | |
" <td>RW</td>\n", | |
" <td>10.0</td>\n", | |
" <td>7/1/2004</td>\n", | |
" <td>2018.0</td>\n", | |
" <td>93</td>\n", | |
" <td>...</td>\n", | |
" <td>88</td>\n", | |
" <td>89</td>\n", | |
" <td>90</td>\n", | |
" <td>74</td>\n", | |
" <td>85</td>\n", | |
" <td>14</td>\n", | |
" <td>6</td>\n", | |
" <td>15</td>\n", | |
" <td>11</td>\n", | |
" <td>8</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>Neymar</td>\n", | |
" <td>Brazil</td>\n", | |
" <td>LW</td>\n", | |
" <td>10.0</td>\n", | |
" <td>FC Barcelona</td>\n", | |
" <td>LW</td>\n", | |
" <td>11.0</td>\n", | |
" <td>7/1/2013</td>\n", | |
" <td>2021.0</td>\n", | |
" <td>92</td>\n", | |
" <td>...</td>\n", | |
" <td>77</td>\n", | |
" <td>79</td>\n", | |
" <td>84</td>\n", | |
" <td>81</td>\n", | |
" <td>83</td>\n", | |
" <td>15</td>\n", | |
" <td>9</td>\n", | |
" <td>15</td>\n", | |
" <td>9</td>\n", | |
" <td>11</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>Luis Suárez</td>\n", | |
" <td>Uruguay</td>\n", | |
" <td>LS</td>\n", | |
" <td>9.0</td>\n", | |
" <td>FC Barcelona</td>\n", | |
" <td>ST</td>\n", | |
" <td>9.0</td>\n", | |
" <td>7/11/2014</td>\n", | |
" <td>2021.0</td>\n", | |
" <td>92</td>\n", | |
" <td>...</td>\n", | |
" <td>86</td>\n", | |
" <td>86</td>\n", | |
" <td>84</td>\n", | |
" <td>85</td>\n", | |
" <td>88</td>\n", | |
" <td>33</td>\n", | |
" <td>27</td>\n", | |
" <td>31</td>\n", | |
" <td>25</td>\n", | |
" <td>37</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>Manuel Neuer</td>\n", | |
" <td>Germany</td>\n", | |
" <td>GK</td>\n", | |
" <td>1.0</td>\n", | |
" <td>FC Bayern</td>\n", | |
" <td>GK</td>\n", | |
" <td>1.0</td>\n", | |
" <td>7/1/2011</td>\n", | |
" <td>2021.0</td>\n", | |
" <td>92</td>\n", | |
" <td>...</td>\n", | |
" <td>16</td>\n", | |
" <td>14</td>\n", | |
" <td>11</td>\n", | |
" <td>47</td>\n", | |
" <td>11</td>\n", | |
" <td>91</td>\n", | |
" <td>89</td>\n", | |
" <td>95</td>\n", | |
" <td>90</td>\n", | |
" <td>89</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>5 rows × 53 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Name Nationality National_Position National_Kit \\\n", | |
"0 Cristiano Ronaldo Portugal LS 7.0 \n", | |
"1 Lionel Messi Argentina RW 10.0 \n", | |
"2 Neymar Brazil LW 10.0 \n", | |
"3 Luis Suárez Uruguay LS 9.0 \n", | |
"4 Manuel Neuer Germany GK 1.0 \n", | |
"\n", | |
" Club Club_Position Club_Kit Club_Joining Contract_Expiry Rating \\\n", | |
"0 Real Madrid LW 7.0 7/1/2009 2021.0 94 \n", | |
"1 FC Barcelona RW 10.0 7/1/2004 2018.0 93 \n", | |
"2 FC Barcelona LW 11.0 7/1/2013 2021.0 92 \n", | |
"3 FC Barcelona ST 9.0 7/11/2014 2021.0 92 \n", | |
"4 FC Bayern GK 1.0 7/1/2011 2021.0 92 \n", | |
"\n", | |
" ... Long_Shots Curve Freekick_Accuracy Penalties Volleys \\\n", | |
"0 ... 90 81 76 85 88 \n", | |
"1 ... 88 89 90 74 85 \n", | |
"2 ... 77 79 84 81 83 \n", | |
"3 ... 86 86 84 85 88 \n", | |
"4 ... 16 14 11 47 11 \n", | |
"\n", | |
" GK_Positioning GK_Diving GK_Kicking GK_Handling GK_Reflexes \n", | |
"0 14 7 15 11 11 \n", | |
"1 14 6 15 11 8 \n", | |
"2 15 9 15 9 11 \n", | |
"3 33 27 31 25 37 \n", | |
"4 91 89 95 90 89 \n", | |
"\n", | |
"[5 rows x 53 columns]" | |
] | |
}, | |
"execution_count": 159, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df = pd.read_csv(\"dataset.csv\")\n", | |
"df.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<br>\n", | |
"# Basic statistical measure to all attributes" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 160, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style>\n", | |
" .dataframe thead tr:only-child th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: left;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>National_Kit</th>\n", | |
" <th>Club_Kit</th>\n", | |
" <th>Contract_Expiry</th>\n", | |
" <th>Rating</th>\n", | |
" <th>Age</th>\n", | |
" <th>Weak_foot</th>\n", | |
" <th>Skill_Moves</th>\n", | |
" <th>Ball_Control</th>\n", | |
" <th>Dribbling</th>\n", | |
" <th>Marking</th>\n", | |
" <th>...</th>\n", | |
" <th>Long_Shots</th>\n", | |
" <th>Curve</th>\n", | |
" <th>Freekick_Accuracy</th>\n", | |
" <th>Penalties</th>\n", | |
" <th>Volleys</th>\n", | |
" <th>GK_Positioning</th>\n", | |
" <th>GK_Diving</th>\n", | |
" <th>GK_Kicking</th>\n", | |
" <th>GK_Handling</th>\n", | |
" <th>GK_Reflexes</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>count</th>\n", | |
" <td>1075.000000</td>\n", | |
" <td>17587.000000</td>\n", | |
" <td>17587.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>...</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" <td>17588.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>mean</th>\n", | |
" <td>12.219535</td>\n", | |
" <td>21.294536</td>\n", | |
" <td>2018.899414</td>\n", | |
" <td>66.166193</td>\n", | |
" <td>25.460314</td>\n", | |
" <td>2.934103</td>\n", | |
" <td>2.303161</td>\n", | |
" <td>57.972766</td>\n", | |
" <td>54.802877</td>\n", | |
" <td>44.230327</td>\n", | |
" <td>...</td>\n", | |
" <td>47.403173</td>\n", | |
" <td>47.181146</td>\n", | |
" <td>43.383443</td>\n", | |
" <td>49.165738</td>\n", | |
" <td>43.275586</td>\n", | |
" <td>16.609620</td>\n", | |
" <td>16.823061</td>\n", | |
" <td>16.458324</td>\n", | |
" <td>16.559814</td>\n", | |
" <td>16.901183</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>std</th>\n", | |
" <td>6.933187</td>\n", | |
" <td>19.163741</td>\n", | |
" <td>1.698787</td>\n", | |
" <td>7.083012</td>\n", | |
" <td>4.680217</td>\n", | |
" <td>0.655927</td>\n", | |
" <td>0.746156</td>\n", | |
" <td>16.834779</td>\n", | |
" <td>18.913857</td>\n", | |
" <td>21.561703</td>\n", | |
" <td>...</td>\n", | |
" <td>19.211887</td>\n", | |
" <td>18.464396</td>\n", | |
" <td>17.701903</td>\n", | |
" <td>15.871735</td>\n", | |
" <td>17.710839</td>\n", | |
" <td>17.139904</td>\n", | |
" <td>17.798052</td>\n", | |
" <td>16.600741</td>\n", | |
" <td>16.967256</td>\n", | |
" <td>18.034485</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>min</th>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>2017.000000</td>\n", | |
" <td>45.000000</td>\n", | |
" <td>17.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>4.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>...</td>\n", | |
" <td>4.000000</td>\n", | |
" <td>6.000000</td>\n", | |
" <td>4.000000</td>\n", | |
" <td>7.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>25%</th>\n", | |
" <td>6.000000</td>\n", | |
" <td>9.000000</td>\n", | |
" <td>2017.000000</td>\n", | |
" <td>62.000000</td>\n", | |
" <td>22.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>2.000000</td>\n", | |
" <td>53.000000</td>\n", | |
" <td>47.000000</td>\n", | |
" <td>22.000000</td>\n", | |
" <td>...</td>\n", | |
" <td>32.000000</td>\n", | |
" <td>34.000000</td>\n", | |
" <td>31.000000</td>\n", | |
" <td>39.000000</td>\n", | |
" <td>30.000000</td>\n", | |
" <td>8.000000</td>\n", | |
" <td>8.000000</td>\n", | |
" <td>8.000000</td>\n", | |
" <td>8.000000</td>\n", | |
" <td>8.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>50%</th>\n", | |
" <td>12.000000</td>\n", | |
" <td>18.000000</td>\n", | |
" <td>2019.000000</td>\n", | |
" <td>66.000000</td>\n", | |
" <td>25.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>2.000000</td>\n", | |
" <td>63.000000</td>\n", | |
" <td>60.000000</td>\n", | |
" <td>48.000000</td>\n", | |
" <td>...</td>\n", | |
" <td>52.000000</td>\n", | |
" <td>48.000000</td>\n", | |
" <td>42.000000</td>\n", | |
" <td>50.000000</td>\n", | |
" <td>44.000000</td>\n", | |
" <td>11.000000</td>\n", | |
" <td>11.000000</td>\n", | |
" <td>11.000000</td>\n", | |
" <td>11.000000</td>\n", | |
" <td>11.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>75%</th>\n", | |
" <td>18.000000</td>\n", | |
" <td>27.000000</td>\n", | |
" <td>2020.000000</td>\n", | |
" <td>71.000000</td>\n", | |
" <td>29.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>3.000000</td>\n", | |
" <td>69.000000</td>\n", | |
" <td>68.000000</td>\n", | |
" <td>64.000000</td>\n", | |
" <td>...</td>\n", | |
" <td>63.000000</td>\n", | |
" <td>62.000000</td>\n", | |
" <td>57.000000</td>\n", | |
" <td>61.000000</td>\n", | |
" <td>57.000000</td>\n", | |
" <td>14.000000</td>\n", | |
" <td>14.000000</td>\n", | |
" <td>14.000000</td>\n", | |
" <td>14.000000</td>\n", | |
" <td>14.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>max</th>\n", | |
" <td>36.000000</td>\n", | |
" <td>99.000000</td>\n", | |
" <td>2023.000000</td>\n", | |
" <td>94.000000</td>\n", | |
" <td>47.000000</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>5.000000</td>\n", | |
" <td>95.000000</td>\n", | |
" <td>97.000000</td>\n", | |
" <td>92.000000</td>\n", | |
" <td>...</td>\n", | |
" <td>91.000000</td>\n", | |
" <td>92.000000</td>\n", | |
" <td>93.000000</td>\n", | |
" <td>96.000000</td>\n", | |
" <td>93.000000</td>\n", | |
" <td>91.000000</td>\n", | |
" <td>89.000000</td>\n", | |
" <td>95.000000</td>\n", | |
" <td>91.000000</td>\n", | |
" <td>90.000000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>8 rows × 41 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" National_Kit Club_Kit Contract_Expiry Rating \\\n", | |
"count 1075.000000 17587.000000 17587.000000 17588.000000 \n", | |
"mean 12.219535 21.294536 2018.899414 66.166193 \n", | |
"std 6.933187 19.163741 1.698787 7.083012 \n", | |
"min 1.000000 1.000000 2017.000000 45.000000 \n", | |
"25% 6.000000 9.000000 2017.000000 62.000000 \n", | |
"50% 12.000000 18.000000 2019.000000 66.000000 \n", | |
"75% 18.000000 27.000000 2020.000000 71.000000 \n", | |
"max 36.000000 99.000000 2023.000000 94.000000 \n", | |
"\n", | |
" Age Weak_foot Skill_Moves Ball_Control Dribbling \\\n", | |
"count 17588.000000 17588.000000 17588.000000 17588.000000 17588.000000 \n", | |
"mean 25.460314 2.934103 2.303161 57.972766 54.802877 \n", | |
"std 4.680217 0.655927 0.746156 16.834779 18.913857 \n", | |
"min 17.000000 1.000000 1.000000 5.000000 4.000000 \n", | |
"25% 22.000000 3.000000 2.000000 53.000000 47.000000 \n", | |
"50% 25.000000 3.000000 2.000000 63.000000 60.000000 \n", | |
"75% 29.000000 3.000000 3.000000 69.000000 68.000000 \n", | |
"max 47.000000 5.000000 5.000000 95.000000 97.000000 \n", | |
"\n", | |
" Marking ... Long_Shots Curve \\\n", | |
"count 17588.000000 ... 17588.000000 17588.000000 \n", | |
"mean 44.230327 ... 47.403173 47.181146 \n", | |
"std 21.561703 ... 19.211887 18.464396 \n", | |
"min 3.000000 ... 4.000000 6.000000 \n", | |
"25% 22.000000 ... 32.000000 34.000000 \n", | |
"50% 48.000000 ... 52.000000 48.000000 \n", | |
"75% 64.000000 ... 63.000000 62.000000 \n", | |
"max 92.000000 ... 91.000000 92.000000 \n", | |
"\n", | |
" Freekick_Accuracy Penalties Volleys GK_Positioning \\\n", | |
"count 17588.000000 17588.000000 17588.000000 17588.000000 \n", | |
"mean 43.383443 49.165738 43.275586 16.609620 \n", | |
"std 17.701903 15.871735 17.710839 17.139904 \n", | |
"min 4.000000 7.000000 3.000000 1.000000 \n", | |
"25% 31.000000 39.000000 30.000000 8.000000 \n", | |
"50% 42.000000 50.000000 44.000000 11.000000 \n", | |
"75% 57.000000 61.000000 57.000000 14.000000 \n", | |
"max 93.000000 96.000000 93.000000 91.000000 \n", | |
"\n", | |
" GK_Diving GK_Kicking GK_Handling GK_Reflexes \n", | |
"count 17588.000000 17588.000000 17588.000000 17588.000000 \n", | |
"mean 16.823061 16.458324 16.559814 16.901183 \n", | |
"std 17.798052 16.600741 16.967256 18.034485 \n", | |
"min 1.000000 1.000000 1.000000 1.000000 \n", | |
"25% 8.000000 8.000000 8.000000 8.000000 \n", | |
"50% 11.000000 11.000000 11.000000 11.000000 \n", | |
"75% 14.000000 14.000000 14.000000 14.000000 \n", | |
"max 89.000000 95.000000 91.000000 90.000000 \n", | |
"\n", | |
"[8 rows x 41 columns]" | |
] | |
}, | |
"execution_count": 160, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.describe()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<br>\n", | |
"# Add a new attribute `rating_class`" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Let's try to see the distribution of player's rating" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 161, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.axes._subplots.AxesSubplot at 0x7f94c694ceb8>" | |
] | |
}, | |
"execution_count": 161, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAD8CAYAAACGsIhGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8XHd57/HPo5Es2bIWW1K8Sd632I6XxDgrgRLIwhJD\nSV44QBNK2pQLuRRo4QZ6LxdyubdQWlJaQtuUpISUkEBoUjcYQkgCZMOJE2+x40W2YkuOFy22rMXa\nn/vHnAmKInvGjs6cGc33/XrppZlzfjPnOR5Zj87v+Z3fz9wdERGRU8mLOgAREcl8ShYiIpKUkoWI\niCSlZCEiIkkpWYiISFJKFiIikpSShYiIJKVkISIiSSlZiIhIUvlRBzBSKisrfebMmVGHISKSVV54\n4YUmd69K1m7UJIuZM2eyYcOGqMMQEckqZrYvlXbqhhIRkaSULEREJCklCxERSSrUZGFmV5rZTjOr\nNbNbhtlfaGb3B/vXm9nMQfuWmtmzZrbNzLaaWVGYsYqIyMmFlizMLAbcDlwFLAKuM7NFQ5rdCBx1\n97nAbcA3gtfmA/8OfMLdFwNvB3rDilVERE4tzCuLVUCtu+919x7gPmD1kDargbuDxw8Al5mZAZcD\nW9x9M4C7N7t7f4ixiojIKYSZLKYB9YOeNwTbhm3j7n1AK1ABzAfczB4xsxfN7AshxikiIklk6n0W\n+cAlwFuATuAxM3vB3R8b3MjMbgJuApg+fXrag5Tc1dHdx39tfpXmjh4unVfFOdVlUYckEqowk8UB\noGbQ8+pg23BtGoI6RRnQTPwq5Lfu3gRgZuuAc4HXJQt3vwO4A2DlypVaTFzSYkvDMW68ewONbd0A\nfPORnXzy7XP4/BULiPeiiow+YXZDPQ/MM7NZZjYGWAOsHdJmLXBD8Pga4HF3d+AR4BwzGxckkbcB\n20OMVSQl9S2dfOR76ynMz+OBT1zI5i9fzpq31PDdX+/hzqfqog5PJDShXVm4e5+Z3Uz8F38MuMvd\nt5nZrcAGd18L3AncY2a1QAvxhIK7HzWzbxFPOA6sc/efhRWrSCrcnS88sAV3uPdPLmB6xTgA/t8H\nzqG5o4dvPrKTd549iZmVxRFHKjLyLP6HfPZbuXKla24oCdNvdzVy/V3PcevqxVx/4czX7Tt8vIvL\n/u43vG1+Fbd/5NxoAhQ5A0E9eGWydrqDWyRF33milillRXzoLTVv2DeptIjrL5zBupcOsqexPYLo\nRMKlZCGSgr2N7TxX18INF82kMD82bJuPXzKLglge9zyb0iSeIllFyUIkBQ9tPIAZvH/50FuFfq9y\nfCHvWjSJ/9x0gJ6+gTRGJxI+JQuRFDy89SAXzalgctmppyi75rxqjnb28viOI2mKTCQ9lCxEkqhv\n6WRvYweXLZyUtO1b51ZyVkkhD25sSENkIumjZCGSxG92NQLw9gVJV54kP5bHFYsn89tdTXT1ajoz\nGT2ULESS+O2uRqonjGVWivdPvHPRJE709vPMnqaQIxNJHyULkVNwd17cf5TzZ1WkPJXHBbMnMr4w\nn0e3q24ho4eShcgpNBw9QVN7D+fOKE/5NYX5MS6dX8njOw4zWm56FVGyEDmFF/cfBWBFzYTTet1b\n51Vx+Hi3btCTUUPJQuQUNu4/xrgxMeZPGn9ar7t4TiUAz+xpDiMskbRTshA5hY37j7Ksupz82On9\nV5leMY7qCWN5ulZFbhkdlCxETqK3f4DtB4+ztObMFja6eE4lz+5ppn9AdQvJfkoWIiext7GD3n5n\n0ZTSM3r9hXMqON7Vx45Dx0c4MpH0U7IQOYnEL/mFk88sWZw3I14Uf3H/sRGLSSQqShYiJ7HjUBsF\nMWN21ZktZlQ9YSxVJYW8uO/oCEcmkn5KFiInsePgceZUjafgNIvbCWbGedMn8IKShYwCShYiJ7Hj\nUBsLJ5e8qfc4b8YE9rd0cqSta4SiEomGkoXIMFo7eznY2sXCMyxuJyTu/N6ouoVkOSULkWHUNrYB\nnPbNeEMtmlJGnsG2A60jEZZIZJQsRIaxt7EDgNmVby5ZjB0TY+5Z43npVQ2fleymZCEyjLqmDvLz\njOoJY9/0ey2eWsa2V3VlIdlNyUJkGHsbO5heMe60p/kYzuKppRw+3k1jW/cIRCYSDSULkWHUNXUw\nO8XFjpJZMi0+XYiuLiSbhZoszOxKM9tpZrVmdssw+wvN7P5g/3ozmxlsn2lmJ8xsU/D1z2HGKTLY\nwIBT19zB7Ko3V69IWDQ1PqJqm+oWksXyw3pjM4sBtwPvAhqA581srbtvH9TsRuCou881szXAN4AP\nBfv2uPvysOITOZkDx07Q0zeQ8jKqyZQWFTCjYpyuLCSrhXllsQqodfe97t4D3AesHtJmNXB38PgB\n4DJLde1KkZDUNcVHQo1UsoB43UJXFpLNwkwW04D6Qc8bgm3DtnH3PqAVqAj2zTKzjWb2GzN7a4hx\nirxOIlmMVM0CYP6kEva3dHKip3/E3lMknTK1wH0QmO7uK4DPAfea2RtupTWzm8xsg5ltaGxsTHuQ\nMjrVNXUwvjCfqpLCEXvP+ZNKcEfLrErWCjNZHABqBj2vDrYN28bM8oEyoNndu929GcDdXwD2APOH\nHsDd73D3le6+sqqqKoRTkFy0p7GdWZXFjGSPaOJO8F2H20bsPUXSKcxk8Twwz8xmmdkYYA2wdkib\ntcANweNrgMfd3c2sKiiQY2azgXnA3hBjFXlNXVPHiNYrAGZUFFMQM3YqWUiWCi1ZBDWIm4FHgJeB\nH7v7NjO71cyuDprdCVSYWS3x7qbE8NpLgS1mtol44fsT7t4SVqwiCV29/Rw4duKM17A4mYJYHrMr\nx7P7sLqhJDuFNnQWwN3XAeuGbPvyoMddwLXDvO6nwE/DjE1kOPuaO3Ef2ZFQCfMmjWdTvWafleyU\nqQVukUjUNcX/8n+zEwgOZ/6kEhqOnqCju2/E31skbEoWIoPsDYbNzqwcN+LvnShy1x5RV5RkHyUL\nkUHqGjs4q6SQkqKCEX/veZPiq+5pRJRkIyULkUH2hjASKmHGxHGMyc9jt64sJAspWYgMUtfUMeIj\noRLyY3nMqRqvKwvJSkoWIoFjnT20dPSEUtxOmD9Jw2clOylZiAT2JJZSDenKAuIjog4cO0FbV29o\nxxAJg5KFSGBvMG/TSK1jMZz5QZFbdQvJNkoWIoG9TR0UxIyaEVh3+2QSw2d3q24hWUbJQiSwt7Gd\n6RNHZt3tk6mZMI6igjx2HtKVhWQXJQuRwN7GkVtK9WTy8ox5Z5Ww+4iuLCS7KFmIAP0Dzr7mzlCL\n2wnzJo1n5yElC8kuShYiQMPRTnr6B5gT4rDZhAWTSjjS1k1rp0ZESfZQshAh3gUF4Q6bTUiMiNql\nrijJIkoWIvx+udOwaxYA8yfHk4W6oiSbKFmIEB82Wz6ugInFY0I/1tSyIsYX5mv4rGQVJQsRYM+R\ndmaHNIHgUGYWL3IrWUgWUbKQnOfu7DzcxoKgeygd5p9VojmiJKsoWUjOa2zr5lhnLwsmpTFZTC6h\nuaOHpvbutB1T5M1QspCctyMoNM9P55VFMO2HpiuXbKFkITkvMSpp4eTStB0zcRWjrijJFkoWkvN2\nHGqjqqQwLSOhEqpKCikbW6Ait2QNJQvJebsOt6W1XgHxEVELJpew4+DxtB5X5EwpWUhO6+0fiCeL\nNNYrEhZPLeXlg230D3jajy1yukJNFmZ2pZntNLNaM7tlmP2FZnZ/sH+9mc0csn+6mbWb2V+GGafk\nrl2H2+juG2BpdVnaj714ahknevupa+pI+7FFTldoycLMYsDtwFXAIuA6M1s0pNmNwFF3nwvcBnxj\nyP5vAT8PK0aRLQ2tACytLk/7sRdPjRfUt73amvZji5yuMK8sVgG17r7X3XuA+4DVQ9qsBu4OHj8A\nXGZmBmBm7wfqgG0hxig5bkvDMUqL8plZMS7tx5571njG5Oex7VXVLSTzhZkspgH1g543BNuGbePu\nfUArUGFm44H/AXw1xPhE2FzfytLqcoK/UdKqIJbHwsklvHRAVxaS+TK1wP0V4DZ3P+UgdDO7ycw2\nmNmGxsbG9EQmo0ZXbz+7DrdFUq9IWDy1jG2vHsddRW7JbGEmiwNAzaDn1cG2YduYWT5QBjQD5wN/\nY2avAJ8BvmRmNw89gLvf4e4r3X1lVVXVyJ+BjGqb64/RN+Asr0l/vSJh8dRSWk/00nD0RGQxiKQi\nP8T3fh6YZ2aziCeFNcCHh7RZC9wAPAtcAzzu8T+x3ppoYGZfAdrd/Tshxio56Ok9zeQZnD+7IrIY\nlkyLX9Vse/U4NRPTXzcRSVVoVxZBDeJm4BHgZeDH7r7NzG41s6uDZncSr1HUAp8D3jC8ViQsT9c2\nsbS6nLKxBZHFsHByCbE804goyXhhXlng7uuAdUO2fXnQ4y7g2iTv8ZVQgpOc1tbVy6b6Y/y3t82J\nNI6ighhzqoo1IkoyXqYWuEVCtX5vC/0DzsVzK6MOhSVTy9jS0Koit2Q0JQvJSU/VNlFUkMe5M6Ir\nbicsrS6jqb2bg61dUYciclJKFpKTnq5tYtWsCgrzY1GHwrJgNNaWhmMRRyJyckoWknMOH+9i95F2\nLpkb3Siowc6eUkpBzNhUryK3ZC4lC8k5T9c2AWREvQLiRe6Fk0t1ZSEZTclCcs5TtU1MLB7D2Wlc\nGS+ZZTXxIveApiuXDKVkITnF3Xm6tokL51SQl5f++aBOZml1Oe3dfext0jKrkpmULCSn7Gls5/Dx\nbi7JkC6ohMSUI5tVt5AMpWQhOeWp3fF6RaYlizlV4ykeE2Oz6haSoZQsJKf8bm8L1RPGZtw8TLE8\nY8m0MjY36MpCMpOSheSMgQHnuVdaOH9WZgyZHWp5TTkvv3qcnr6BqEMReQMlC8kZu4+009LRwwWz\nJ0YdyrCWVpfT0z/AjkOaJ0oyT0rJwsz+w8zeY2ZKLpK11tc1A3BBhFOSn8qymvh05ZvrVbeQzJPq\nL//vEl+LYreZfd3MFoQYk0go1u9tYWpZEdUTxkYdyrCmlY+loniM7uSWjJRSsnD3X7n7R4BzgVeA\nX5nZM2b2x2YW3WIAIilyd9bXNXP+7IpI1ttOhZmxrKZcd3JLRkq5W8nMKoCPAX8CbAS+TTx5PBpK\nZCIjaH9LJ03tPaycOSHqUE5pWXU5tY3ttHf3RR2KyOukWrN4EHgSGAe8z92vdvf73f2/A+PDDFBk\nJCSGpC6rjn5K8lNZWlOGO2zVEFrJMKleWfyruy9y979294MAZlYI4O4rQ4tOZIRsqT9GYX4eCyaX\nRB3KKSWSmW7Ok0yTarL42jDbnh3JQETCtKWhlcVTSymIZfaAvonFY6iZOFZ1C8k4p1yD28wmA9OA\nsWa2AkhUBkuJd0mJZLy+/gG2HmjlQ2+piTqUlCyrLmfjfiULySynTBbAFcSL2tXAtwZtbwO+FFJM\nIiOqtrGdE739r93HkOmWVZfz8JaDNLZ1U1VSGHU4IkCSZOHudwN3m9kH3f2naYpJZERtCe5bWJrh\nxe2EwcusXnb2pIijEYlL1g31UXf/d2CmmX1u6H53/9YwLxPJKJsbjlFSmM+siuKoQ0nJkmml5Fn8\nTm4lC8kUybqhEv+7NDxWstaWhlbOqS7LqMWOTmXcmHzmTyphk4bPSgZJ1g31L8H3r6YnHJGR1d3X\nz45Dx7nxktlRh3JallWX88j2Q7h7xt5xLrkl1Zvy/sbMSs2swMweM7NGM/toCq+70sx2mlmtmd0y\nzP5CM7s/2L/ezGYG21eZ2abga7OZfeB0T0wE4OWDbfT2O8uqs6O4nbC0poxjnb3Ut5yIOhQRIPX7\nLC539+PAe4nPDTUX+PypXmBmMeB24CpgEXCdmS0a0uxG4Ki7zwVuA74RbH8JWOnuy4ErgX8xs2Rd\nZiJvsDW4X2FpTXYUtxMSN+dt0v0WkiFSTRaJX9TvAX7i7ql0pq4Cat19r7v3APcBq4e0WQ3cHTx+\nALjMzMzdO909MTlOEeApxinyOlsPtFJRPIapZUVRh3JaFkwuoTA/T9OVS8ZINVk8bGY7gPOAx8ys\nCuhK8pppQP2g5w3BtmHbBMmhFagAMLPzzWwbsBX4xKDk8Rozu8nMNpjZhsbGxhRPRXLJloZWlkwr\ny7p+/4JYHounlupObskYqU5RfgtwEfGuoV6ggzdeJYwod1/v7ouBtwBfNLM3/Gno7ne4+0p3X1lV\nVRVmOJKFTvT0s/tIO0uzrF6RsKymnK0HWunr1zKrEr3TmShnIfAhM7seuAa4PEn7A8Dg+RWqg23D\ntglqEmVA8+AG7v4y0A4sOY1YRdh+8Dj9A84507I0WVSX09U7wO4j7VGHIpLyaKh7gL8FLiH+l/5b\ngGSzzT4PzDOzWWY2BlgDrB3SZi1wQ/D4GuBxd/fgNfnBsWcQT1SvpBKrSMJrxe0suXN7qMSd3Kpb\nSCZIdYTRSmCRu6dcaHb3PjO7GXgEiAF3ufs2M7sV2ODua4E7gXvMrBZoIZ5QIJ6UbjGzXmAA+KS7\nN6V6bBGALQdaqRxfyKTS7JxfaWbFOEqL8tnc0MqaVVFHI7ku1WTxEjAZOHg6b+7u64B1Q7Z9edDj\nLuDaYV53D3DP6RxLZKitDa0src6+4nZCYplVXVlIJki1ZlEJbDezR8xsbeIrzMBE3oyO7j5qG9uz\ntl6RsKy6nJ2H2zjR0x91KJLjUr2y+EqYQYiMtG2vHsedrB0JlbC0uoz+AWf7wVbOmzEx6nAkh6U6\ndPY3xAvMBcHj54EXQ4xL5E3ZuP8okL3F7YTlQZF7U70mFZRopToa6k+J32H9L8GmacBDYQUl8ma9\nsO8oMyvGZf3iQWeVFjGlrEg350nkUq1ZfAq4GDgO4O67gbPCCkrkzXB3Xth3lHNnTIg6lBGxtLpM\nRW6JXKrJojuY3wl47QY6zdckGWlfcyfNHT2cN0qSxbKacl5p7uRYZ0/yxiIhSTVZ/MbMvgSMNbN3\nAT8B/iu8sETO3Av74vWKlaOkIJyYgXaLFkOSCKWaLG4BGolP6vdnxO+d+J9hBSXyZryw/yglRfnM\nO2t0LPB4TjCiS11REqWUhs66+4CZPQQ85O6a3lUy2oZXWlgxfULWLKOaTGlRAbOritmsKwuJ0Cmv\nLCzuK2bWBOwEdgar5H35VK8TiUpjWze7Drdz4eyKqEMZUcury9lUf4zTmHFHZEQl64b6LPFRUG9x\n94nuPhE4H7jYzD4benQip+mZPfEpxC6aM7qSxbKacprauznYmmwZGZFwJEsWfwRc5+51iQ3uvhf4\nKHB9mIGJnIln9zRTWpTPkiyf5mOoxJ3out9CopIsWRQMN9trULcoCCckkTP39J4mLphdQWyU1CsS\nzp5SSkHMdCe3RCZZsjjVwG4N+paMUt/SSX3LiVHXBQVQVBBj4WQtsyrRSTYaapmZHR9muwFvWOZU\nJEpP7o5fBF88tzLiSMKxrKaMhza+ysCAj5qRXpI9Tnll4e4xdy8d5qvE3dUNJRnl8R1HmFY+lrmj\n5P6KoZZVl9Pe3cfeJi2zKul3Omtwi2Ssrt5+nq5t4h0Lz8raxY6S+f0yq6pbSPopWciosL6uhRO9\n/bxj4eid33JO1XiKx8TYrLqFREDJQkaFJ3YcoaggjwtHYXE7IZZnLJlWpju5JRJKFpL13J3Hdxzh\nojmVFBXEog4nVMtrynn51eN092mZVUkvJQvJensaO9jf0skfjOIuqIRlNeX09A+w42Bb1KFIjlGy\nkKz3xI4jAKO6XpGQuJNbdQtJNyULyXqP7TjMgkklTCsfG3UooZtWPpbK8YVs2q9kIemlZCFZrbm9\nm+fqWrh88aSoQ0kLM2N5TXwGWpF0CjVZmNmVZrbTzGrN7JZh9hea2f3B/vVmNjPY/i4ze8HMtgbf\n3xFmnJK9Ht1+mAGHKxZPjjqUtFkxvZy9TR20dvZGHYrkkNCShZnFgNuBq4BFwHVmtmhIsxuBo+4+\nF7gN+EawvQl4n7ufA9wA3BNWnJLdfrHtEDUTx7J4amnUoaTN8uDmvE2qW0gahXllsQqodfe97t4D\n3AesHtJmNXB38PgB4DIzM3ff6O6vBtu3EV/7uzDEWCULtZ7o5enaJq5aMmXU3rU9nKXVZZihuoWk\nVZjJYhpQP+h5Q7Bt2Dbu3ge0AkPvqvog8KK7dw89gJndZGYbzGxDY6NWe801T+w4Qm+/51QXFEBJ\nUQFzq8azqf5o1KFIDsnoAreZLSbeNfVnw+139zvcfaW7r6yqqkpvcBK5n790kEmlhawIumVyyYrp\nWmZV0ivMZHEAqBn0vDrYNmwbM8sHyoDm4Hk18CBwvbvvCTFOyULHu3r59c5Grlw8OSen615eM4Gj\nnb3sb+mMOhTJEWEmi+eBeWY2y8zGAGuAtUParCVewAa4Bnjc3d3MyoGfAbe4+9MhxihZ6udbD9Ld\nN8D7Vwzt2cwNiSL3RtUtJE1CSxZBDeJm4BHgZeDH7r7NzG41s6uDZncCFWZWC3wOSAyvvRmYC3zZ\nzDYFX6P/9lxJ2U9fPMDsyuLXfmnmmvmTxjO2IKb7LSRtkq2U96a4+zpg3ZBtXx70uAu4dpjXfQ34\nWpixSfaqb+nkuboW/vLy+Tk1Cmqw/Fge51SXsVHJQtIkowvcIsP5yQsNAKxenptdUAkrNAOtpJGS\nhWSV7r5+7l2/j3csPIuaieOiDidSy4MZaLe/ejzqUCQHKFlIVvnZloM0tffwsYtmRh1K5FZMnwCg\nuoWkhZKFZI3+Aeeffr2HeWeN563zKqMOJ3KTy4qYXFqkZCFpoWQhWePBjQfYfaSdz74rdwvbQy2v\nKdfwWUkLJQvJCt19/dz26C7OmVbGVUtya3qPU1k+vZz9LZ00t79hNhyREaVkIVnhh7/bz4FjJ/jC\nlQt0VTFI4j4TrZwnYVOykIzX3t3H7U/UctGcCi6Zq1rFYOdMKyNPM9BKGihZSMb7t6fqaO7o4fNX\n6KpiqOLCfOZPKtHNeRI6JQvJaK0nevnXJ/fyzrMnvTZUVF5vxfQJbK4/xsCAZqCV8ChZSEa766k6\njnf18dl3zYs6lIy1oqac41191DV3RB2KjGJKFpKxWjt7ueupOq5aMpnFU8uiDidjLZ+uGWglfEoW\nkrF++Nw+2rr7+PRluqo4lTlV4xlfmK+V8yRUShaSkXr7B/jBM/u4ZG4lZ08pjTqcjBbLM5ZWl+lO\nbgmVkoVkpHVbD3LoeBcfv2Rm1KFkheU15ew42EZXr2aglXAoWUjGcXfueqqOWZXFvH2+1rxKxfKa\ncvoGnJcOtEYdioxSShaScV7cf4zNDa388cUzc3J97TOhIreETclCMs5dT9dRUpTPB8+tjjqUrHFW\nSRGzK4t5ek9T1KHIKKVkIRnl8PEufvHSIda8pYbiwlBX/R11Lp1fxbN7mlW3kFAoWUhG+cmGevoH\nnA+fPyPqULLO2xZU0d03wPq6lqhDkVFIyUIyxsCA86Pn6rloTgWzKoujDifrXDi7gsL8PH6980jU\nocgopGQhGePJ2iYOHDvBdaumRx1KVioqiHHhnAp+9fJh3DVPlIwsJQvJGD9av5+JxWO4fPGkqEPJ\nWu8+Zwr1LSfYqiG0MsKULCQjNLd386uXD/PBc6dRmB+LOpysdcWiyRTEjJ9tORh1KDLKhJoszOxK\nM9tpZrVmdssw+wvN7P5g/3ozmxlsrzCzJ8ys3cy+E2aMkhl+se0QfQPOH2q47JtSNq6AS+ZW8vCW\ng5qyXEZUaMnCzGLA7cBVwCLgOjNbNKTZjcBRd58L3AZ8I9jeBfwv4C/Dik8yy8+2HGR2ZTELJ5dE\nHUrW+8C51Rw4dkL3XMiICvPKYhVQ6+573b0HuA9YPaTNauDu4PEDwGVmZu7e4e5PEU8aMso1tXfz\nu73NvPucKVoJbwRcsXgSE8YVcO/6/VGHIqNImMliGlA/6HlDsG3YNu7eB7QCFSHGJBnokW2HGHB4\nz9IpUYcyKhTmx7jmvGoe3X6YI236e0tGRlYXuM3sJjPbYGYbGhsbow5HzpC6oEbemlXT6Rtw7n+u\nPnljkRSEmSwOADWDnlcH24ZtY2b5QBnQnOoB3P0Od1/p7iurqqreZLgSBXVBhWNO1XgunV/F3c/u\n0/QfMiLCTBbPA/PMbJaZjQHWAGuHtFkL3BA8vgZ43HU3UU5RF1R4/uzS2TS1d/PgxqF/o4mcvtCS\nRVCDuBl4BHgZ+LG7bzOzW83s6qDZnUCFmdUCnwNeG15rZq8A3wI+ZmYNw4ykklFg3VZ1QYXlojkV\nLJ5ayr8+uVfDaOVNC3VaT3dfB6wbsu3Lgx53Adee5LUzw4xNotfU3s2ze5r55NvnqgsqBGbGTZfO\n5s/v28SvXj7M5YsnRx2SZLGsLnBLdlMXVPjec84UqieM5R8fr9V8UfKmKFlIZNQFFb78WB6fvmwe\nWw+08svth6MOR7KYkoVEItEFpVFQ4fvDFdOYXVnMt365i37VLuQMKVlIJNQFlT75sTw+86757Dzc\nxtrNGhklZ0bJQiKhG/HS673nTGFpdRl/vW4HbV29UYcjWUjJQtLu8PEunt3bzPuWTVUXVJrk5Rn/\nZ/USGtu7ue3R3VGHI1lIyULS7uEtB3GHq5dPjTqUnLKsppwPr5rO95+p4zmt0y2nSclC0m7tpgMs\nmVbKnKrxUYeSc7747rOZPnEcn7lvI62d6o6S1ClZSFq90tTB5oZWrl6mq4oojC/M5x+uW8GRtm4+\n/8Bm3XshKVOykLR6aFN8NM57lypZRGVpdTlffPfZ/HL7Ye58qi7qcCRLKFlI2vT1D3Dfc/W8dV4l\nU8vHRh1OTvv4xTO5cvFkvv7zHbywT/ULSU7JQtLm8R1HOHS8i49eMCPqUHKemfE31y5l2oSxfOqH\nG2lu7446JMlwShaSNv++fj+TS4u4bOFZUYciQGlRAbd/+FxaOnv4zP2bNDOtnJKShaTFrsNt/HZX\nI9etmk5+TD92mWLJtDK+8r7FPLm7idufqI06HMlg+l8rafGPj9dSPCbG9ReqCyrTXLeqhtXLp/L3\nj+1ma0Nr1OFIhlKykNDtPtzGw1te5aMXzmBC8Ziow5EhzIxbr15C1fhCPvfjTVqGVYalZCGhcndu\nfXg74wuDXrpHAAAJjUlEQVTzuemts6MOR06ibFwB37hmKbuPtHPbo7uiDkcykJKFhOqRbYd4cncT\nn33nfCrGF0YdjpzC2+ZX8eHzp3PHk3vZ8IqG08rrKVlIaI60dfGlB19i0ZRS/ki1iqzwpXefTfWE\nsfzFTzbT2dMXdTiSQZQsJBS9/QN89v5NdHT38e01yynQCKisML4wn29es4z9LZ18/ec7og5HMoj+\nB8uIc3f+99ptPF3bzNfev4R5k7RmRTa5YHYFH794Fj94dh/rth6MOhzJEEoWMqLcnW8+spN71+/n\nE2+bw7Ura6IOSc7A569YwLnTy/n0jzaydvOrUYcjGUDJQkZMX/8AX/2v7Xz313v48PnT+cIVC6IO\nSc5QUUGM7398Fctr4gnjCw9s5vDxrqjDkgjlRx2AjA77mzv5ywc281xdCzdeMov/+Z6ztQpelist\nKuDeP72Av3t0J3c9VceDGw/wzrMnsXr5VC6aW0lpUUHUIUoaWZjz2ZvZlcC3gRjwPXf/+pD9hcAP\ngPOAZuBD7v5KsO+LwI1AP/Bpd3/kVMdauXKlb9iwYcTPQU7O3dl5uI171+/nvufryc8z/u8HlvCB\nFdVRhyYjbF9zBz94dh8PbTxAc0cPsTxjeU0550wrY+HkEhZOKWXeWeMpLtTfn9nGzF5w95VJ24WV\nLMwsBuwC3gU0AM8D17n79kFtPgksdfdPmNka4APu/iEzWwT8CFgFTAV+Bcx395PeWqpkkR5dvf38\nbm8zT+w4wuM7j1DfcoIxsTxWL5/KX1y+gMllRVGHKCHq7R/gxX1HeXJ3E8/saWLHoTY6e37/37Jm\n4lgWTCphaXU5y2vKWVZTTtlYXYFkslSTRZh/BqwCat19bxDQfcBqYPugNquBrwSPHwC+Y/G+i9XA\nfe7eDdSZWW3wfs+GGK8M4e40tffwSnMHL+47ynN1LTyzp5kTvf0UFeRx0ZxKbrp0Du9eMlk33OWI\nglge58+u4PzZFcACBgac+qOd7DzUxq7Dbew4FP96bMcREn+HzqkqZnnNBJbXlDGlbCxl4wooHpNP\nfszIzzMKYnnE8oz8mFGQl0cs+J7Yr+7MzBBmspgG1A963gCcf7I27t5nZq1ARbD9d0NeOy2MIHcc\nOs7N924kiOG17f6GB79/OGw7eO0/hw/a+tq2k1zAJd4r1fd5fRyve6eTtkt2nJPt7+4boKdv4LXn\nsyqLuXZlNX+w8CwunF1BUUFs+JOSnJGXZ8yoKGZGRTGXL5782vbjXb1sbWhl4/6jbKo/xm92HeGn\nLzac0TFiea9PKgUxIz9v0ONYHrmeTt6+oIq/es+iUI+R1R2MZnYTcBPA9OnTz+g9ivJjLBh8H4C9\n8eHgv2x+v23Yl7zW9nU/vJb4Nuh9hj3O4G32xm3DvOnJ4zj5MYeL93XvHGwaE8tjavlYqieMZVlN\nOZW6epAUlRYVcPHcSi6eWwnE/xg52NpFU3s3rSd66ejup29ggP4Bp7ff6esfoG9g0PfgcW+/0zeQ\n2De4ndM7MBDfNjCQJJrRb1Jp+N2/YSaLA8DgQfbVwbbh2jSYWT5QRrzQncprcfc7gDsgXrM4kyBn\nVhZz+0fOPZOXikiKzIyp5WO1nG4WC/M+i+eBeWY2y8zGAGuAtUParAVuCB5fAzzu8f6QtcAaMys0\ns1nAPOC5EGMVEZFTCO3KIqhB3Aw8Qnzo7F3uvs3MbgU2uPta4E7gnqCA3UI8oRC0+zHxYngf8KlT\njYQSEZFwhXqfRTpp6KyIyOlLdeispvsQEZGklCxERCQpJQsREUlKyUJERJJSshARkaRGzWgoM2sE\n9p3BSyuBphEOJxvovHOLzjv3pHruM9y9KlmjUZMszpSZbUhl2Nhoo/POLTrv3DPS565uKBERSUrJ\nQkREklKyCCYizEE679yi8849I3ruOV+zEBGR5HRlISIiSeVMsjCzGjN7wsy2m9k2M/vzYPtEM3vU\nzHYH3ydEHWsYzCxmZhvN7OHg+SwzW29mtWZ2fzCN/KhjZuVm9oCZ7TCzl83swlz4zM3ss8HP+Utm\n9iMzKxqNn7mZ3WVmR8zspUHbhv18Le4fgvPfYmZZu5DNSc77m8HP+RYze9DMygft+2Jw3jvN7Ioz\nOWbOJAviU53/hbsvAi4APmVmi4BbgMfcfR7wWPB8NPpz4OVBz78B3Obuc4GjwI2RRBW+bwO/cPeF\nwDLi/waj+jM3s2nAp4GV7r6E+BIBaxidn/n3gSuHbDvZ53sV8bVx5hFfYfOf0hRjGL7PG8/7UWCJ\nuy8FdgFfBAh+z60BFgev+a6ZnfaayDmTLNz9oLu/GDxuI/5LYxqwGrg7aHY38P5oIgyPmVUD7wG+\nFzw34B3AA0GT0XreZcClxNdNwd173P0YOfCZE1+rZmywAuU44CCj8DN3998SXwtnsJN9vquBH3jc\n74ByM5uSnkhH1nDn7e6/dPe+4OnviK8wCvHzvs/du929DqgFVp3uMXMmWQxmZjOBFcB6YJK7Hwx2\nHQImRRRWmP4e+AKQWKy4Ajg26AergXjiHG1mAY3AvwVdcN8zs2JG+Wfu7geAvwX2E08SrcAL5MZn\nDif/fKcB9YPajeZ/g48DPw8ej8h551yyMLPxwE+Bz7j78cH7giVdR9XwMDN7L3DE3V+IOpYI5APn\nAv/k7iuADoZ0OY3Sz3wC8b8mZwFTgWLe2GWRE0bj55uMmf0V8W73H47k++ZUsjCzAuKJ4ofu/h/B\n5sOJS9Hg+5Go4gvJxcDVZvYKcB/xrohvE78ETyyrWw0ciCa8UDUADe6+Pnj+APHkMdo/83cCde7e\n6O69wH8Q/znIhc8cTv75HgBqBrUbdf8GZvYx4L3AR/z390WMyHnnTLII+unvBF52928N2rUWuCF4\nfAPwn+mOLUzu/kV3r3b3mcSLXI+7+0eAJ4Brgmaj7rwB3P0QUG9mC4JNlxFf131Uf+bEu58uMLNx\nwc994rxH/WceONnnuxa4PhgVdQHQOqi7KuuZ2ZXEu5uvdvfOQbvWAmvMrNDMZhEv8D932gdw95z4\nAi4hfjm6BdgUfL2beP/9Y8Bu4FfAxKhjDfHf4O3Aw8Hj2cEPTC3wE6Aw6vhCOuflwIbgc38ImJAL\nnznwVWAH8BJwD1A4Gj9z4EfE6zK9xK8kbzzZ5wsYcDuwB9hKfLRY5OcwguddS7w2kfj99s+D2v9V\ncN47gavO5Ji6g1tERJLKmW4oERE5c0oWIiKSlJKFiIgkpWQhIiJJKVmIiEhSShYiIpKUkoWIiCSl\nZCEiIkn9f6HSwl0EdjqUAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7f94c72e4f28>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"df['Rating'].plot(kind='kde')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 162, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Minimum Rating : 45\n", | |
"Maximum Rating : 94\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\"Minimum Rating : {}\".format(df['Rating'].min()))\n", | |
"print(\"Maximum Rating : {}\".format(df['Rating'].max()))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<br>\n", | |
"In order to let us to do the classification problem, the range of number is just large.<br>\n", | |
"So we decided to split the data, and range it into three categorical bins, A, B, C." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 163, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# add new rating class attribute\n", | |
"df['rating_class'] = ['0']*df.shape[0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 164, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"categories = [[80,100,'A'], [60,80,'B'], [40,60,'C']]\n", | |
"\n", | |
"for i in range(df.shape[0]):\n", | |
" rating = df.loc[i]['Rating']\n", | |
" for each in categories:\n", | |
" if rating > each[0] and rating <= each[1]:\n", | |
" df.set_value(i, 'rating_class', each[2])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 165, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style>\n", | |
" .dataframe thead tr:only-child th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: left;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Name</th>\n", | |
" <th>rating_class</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>6593</th>\n", | |
" <td>Adão Salvadaldo</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>9970</th>\n", | |
" <td>Lewie Coyle</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>11592</th>\n", | |
" <td>Isaiah Osbourne</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>373</th>\n", | |
" <td>Cédric Carrasso</td>\n", | |
" <td>A</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7605</th>\n", | |
" <td>Naoki Wako</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>14632</th>\n", | |
" <td>Nils Rütten</td>\n", | |
" <td>C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7644</th>\n", | |
" <td>Oswaldinato</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>10550</th>\n", | |
" <td>Reuben Reid</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>11555</th>\n", | |
" <td>Mario de Luna</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6375</th>\n", | |
" <td>Ãngel Reyna</td>\n", | |
" <td>B</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Name rating_class\n", | |
"6593 Adão Salvadaldo B\n", | |
"9970 Lewie Coyle B\n", | |
"11592 Isaiah Osbourne B\n", | |
"373 Cédric Carrasso A\n", | |
"7605 Naoki Wako B\n", | |
"14632 Nils Rütten C\n", | |
"7644 Oswaldinato B\n", | |
"10550 Reuben Reid B\n", | |
"11555 Mario de Luna B\n", | |
"6375 Ãngel Reyna B" | |
] | |
}, | |
"execution_count": 165, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df.sample(10)[['Name', 'rating_class']]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Limit player to central back only (CB, RCB, LCB)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 166, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"(1347, 54)\n" | |
] | |
} | |
], | |
"source": [ | |
"CB_data = df[df['Club_Position'] == 'CB']\n", | |
"RCB_data = df[df['Club_Position'] == 'RCB']\n", | |
"LCB_data = df[df['Club_Position'] == 'LCB']\n", | |
"\n", | |
"df = pd.concat([CB_data, RCB_data, LCB_data])\n", | |
"print(df.shape)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<br>\n", | |
"# Remove all attributes that seem unimportant to our cause" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 167, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Remaining:\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"array(['Ball_Control', 'Marking', 'Sliding_Tackle', 'Standing_Tackle',\n", | |
" 'Aggression', 'Reactions', 'Interceptions', 'Composure',\n", | |
" 'Short_Pass', 'Long_Pass', 'Acceleration', 'Speed', 'Stamina',\n", | |
" 'Strength', 'Balance', 'Agility', 'Jumping', 'Heading',\n", | |
" 'rating_class'], dtype=object)" | |
] | |
}, | |
"execution_count": 167, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# unimportant attributes\n", | |
"uattr = ['Nationality', 'National_Position', 'National_Kit', 'Club_Position', 'Club_Kit', 'Club_Joining']\n", | |
"uattr += ['Contract_Expiry', 'Height', 'Weight', 'Preffered_Foot', 'Birth_Date', 'Preffered_Position']\n", | |
"uattr += ['Work_Rate', 'Rating', 'Club', 'Name', 'Age']\n", | |
"\n", | |
"# remaining attributes that are not important to Central Back position\n", | |
"uattr += ['Weak_foot', 'Skill_Moves', 'Dribbling', 'Attacking_Position', 'Vision']\n", | |
"uattr += ['Crossing', 'Shot_Power', 'Finishing', 'Long_Shots', 'Curve']\n", | |
"uattr += ['Freekick_Accuracy', 'Penalties', 'Volleys', 'GK_Positioning']\n", | |
"uattr += ['GK_Diving', 'GK_Kicking', 'GK_Handling', 'GK_Reflexes']\n", | |
"\n", | |
"\n", | |
"for each in uattr:\n", | |
" df = df.drop(each, axis=1)\n", | |
" \n", | |
"print(\"Remaining:\")\n", | |
"df.columns.values" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<br>\n", | |
"# Take sample (maximum 500) from the data\n", | |
"To let the distribution to be fair, we will choose data percentage % from each `rating_class`." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 168, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Amounts to take from class 'A' : 43\n", | |
"Amounts to take from class 'B' : 897\n", | |
"Amounts to take from class 'C' : 59\n" | |
] | |
} | |
], | |
"source": [ | |
"max_size = 1000\n", | |
"\n", | |
"total_row = df.shape[0]\n", | |
"new_data = []\n", | |
"\n", | |
"for i, c in enumerate(['A', 'B', 'C']):\n", | |
" df_class = df[df['rating_class'] == c]\n", | |
" amount = int(df_class.shape[0]/total_row*max_size)\n", | |
" print(\"Amounts to take from class '{}' : {}\".format(c, amount))\n", | |
" sample = df_class.sample(amount)\n", | |
" new_data += sample.values.tolist()\n", | |
" \n", | |
"sampling_data = pd.DataFrame(new_data, columns=df.columns)\n", | |
"sampling_data = sampling_data.apply(np.random.permutation) # apply some permutation to the data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 169, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Number of sampling : 999\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\"Number of sampling : {}\".format(sampling_data.shape[0]))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<br>\n", | |
"# Saving the pre-processed data to new CSV file." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 170, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"sampling_data.to_csv(\"dataset-preprocessed.csv\", encoding='utf-8', index=False)" | |
] | |
} | |
], | |
"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.6.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment