{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\nimport gc\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfrom pprint import pprint","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"questions=pd.read_csv('/kaggle/input/riiid-test-answer-prediction/questions.csv')\nquestions.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\ntrain=pd.read_pickle('../input/riiid-trainpkl/riiid_train.pkl.gzip')\ntrain=train[train.content_type_id==0].copy()\ntrain.head(2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pprint(train.info())\n\ntrain.drop(columns=['timestamp',\n                    'content_type_id',\n                    'user_answer',\n                    'prior_question_elapsed_time', \n                    'prior_question_had_explanation'\n                   ],\n           axis=1, inplace=True)\n\npprint(train.info())\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# lets check the Questions"},{"metadata":{"trusted":true},"cell_type":"code","source":"user_question=train.groupby('user_id')[['row_id', 'answered_correctly']].agg({'row_id': 'count', 'answered_correctly': 'sum'}).reset_index().rename(columns={'row_id': 'num_questions'})\nuser_question['percent_answered_correctly']=100*user_question.answered_correctly/user_question.num_questions\nuser_question['answered_wrong']=user_question['num_questions']-user_question['answered_correctly']\nuser_question.head()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"user_question.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"user_question[['num_questions', 'answered_correctly', 'answered_wrong',\n               'percent_answered_correctly']].corr()\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"user_question.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(user_question.num_questions, bins=100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.distplot(user_question.percent_answered_correctly, bins=100)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Most users answered around 40-70% of the times"},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.scatterplot(data=user_question, \n                x='num_questions',\n                y='percent_answered_correctly',\n               )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"looks like the variability in percent questions answered is getting decreased as the user answers more questions"},{"metadata":{},"cell_type":"markdown","source":"Lets bin the users based on the quesions answered to look at the percentage of correct answeres: the variability and the mean."},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Number Of users who anserwerd <=5 questions:\", len(user_question[user_question.num_questions<=5]))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nuser_question[user_question.num_questions<=5]['percent_answered_correctly'].describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"user_question[user_question.num_questions>10000].shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def question_bin(num_questions):\n    if num_questions<=10:\n        return \"0-10\"\n    elif num_questions>10 and num_questions<=30:\n        return '10-30'\n    elif num_questions >30 and num_questions<=100:\n        return '30-100'\n    elif num_questions >100 and num_questions<=1000:\n        return '100-1000'\n    elif num_questions >1000 and num_questions<=5000:\n        return '1000-5000'\n    elif num_questions>5000:\n        return \">5000\"\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nuser_question['question_bin']=user_question.num_questions.apply(question_bin)\nuser_question.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_bin=user_question.groupby('question_bin')[['percent_answered_correctly']].agg(['min', 'max', 'mean', 'std']).reset_index()\nquestion_bin.columns=['question_bin', 'min', 'max', 'mean', 'std']\nquestion_bin.head(10)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nsns.barplot(data=question_bin, \n            x='question_bin',\n            y='mean',\n            order=['0-10', '10-30', '30-100', '100-1000', '1000-5000', '>5000']\n           )\n\nplt.show()\nsns.barplot(data=question_bin, \n            x='question_bin',\n            y='std',\n            order=['0-10', '10-30', '30-100', '100-1000', '1000-5000', '>5000']\n           )\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"clearly as the number of questions attempted increases; there is a raise in the mean of the correct answers and reduction in the varaince of correct answers."},{"metadata":{"trusted":true},"cell_type":"code","source":"del user_question\ndel question_bin\n\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Questions Complexity"},{"metadata":{"trusted":true},"cell_type":"code","source":"questions.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Number Of Questions:\", len(questions))\nprint(\"Number Of Bundles:\", questions.bundle_id.nunique())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%%time\nquestion_stat=train.groupby('content_id')[['answered_correctly', 'user_id']].agg({'answered_correctly': ['count', 'sum'],\n                                                                                  'user_id': 'nunique'\n                                                                                 }).reset_index()\n\nquestion_stat.columns=['question_id', 'num_attempted', 'correctly_answered', 'num_users_attempted']\nquestion_stat['percent_answered_correctly']=100*question_stat['correctly_answered']/question_stat['num_attempted']\nquestion_stat.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.title('Questions Attempted', )\nsns.distplot (question_stat.num_attempted, bins=400)\nplt.show()\n\nplt.title(\"Distribution Of Question Correctly Answered\")\nsns.distplot(question_stat.correctly_answered)\nplt.show()\n\nplt.title(\"Distribution Of Users Attempting the question\")\nsns.distplot(question_stat.num_users_attempted)\nplt.show()\n\n\nplt.title(\"Distribution Of Correctly Answering\")\nsns.distplot(question_stat.percent_answered_correctly)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.boxplot(question_stat.percent_answered_correctly)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Few Questions had only one user who attempted or correctly answered"},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat.sort_values('num_attempted', ascending=False).head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat.sort_values('percent_answered_correctly', ascending=False).head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat[question_stat.percent_answered_correctly >= 90].num_attempted.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.scatterplot(data=question_stat,\n                x='percent_answered_correctly',\n                y='num_attempted'\n               )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(question_stat[(question_stat.num_attempted>=1000) & (question_stat.num_attempted<=6000)])/len(question_stat)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nquestion_stat[(question_stat.num_attempted>=1000) & (question_stat.num_attempted<=6000)].describe()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"About 46.5% of the questions had the attempts between the range [1000, 6000]"},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.scatterplot(data=question_stat[(question_stat.num_attempted>=1000) & (question_stat.num_attempted<=6000)],\n                x='percent_answered_correctly',\n                y='num_attempted'\n               )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Even in the subset range of questions attempted, there seems to be a big varainace in the \ncorrect answers.\n\nThe Percent of Correct Answers skewed to >=50 percent "},{"metadata":{"trusted":true},"cell_type":"code","source":"100*len(question_stat[(question_stat.num_attempted>=1000) & \n              (question_stat.num_attempted<=6000) &\n              (question_stat.percent_answered_correctly>=50)\n             ])/len(question_stat)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"More than 41.6% of the Questions are attempted between [1000, 6000] times and answered atleaset 50% of the times."},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat.corr()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.heatmap(question_stat.corr(), annot=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# lets include the parts and tags "},{"metadata":{"trusted":true},"cell_type":"code","source":"top10_question_ids=question_stat.sort_values('num_attempted', ascending=False).question_id.values[:10]\n\nprint(\"Top 10 Questions Attempted.\")\nquestions[questions.question_id.isin(top10_question_ids)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"question_stat=question_stat.merge(questions[['question_id', 'bundle_id', 'part']],\n                                  how='inner',\n                                  on='question_id')\nquestion_stat.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Number Of Parts:', question_stat.part.nunique())\nquestion_stat.part.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels=list(question_stat.part.value_counts().index)\nvalues=list(question_stat.part.value_counts().values)\n\n\nplt.figure(figsize=(17, 5))\nplt.title('Distribution Of Question Part')\nplt.pie(values,labels=labels, autopct='%.2f%%')\nplt.legend(loc='best')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.title('Count of Questions by their Parts.')\nsns.countplot(data=question_stat, x='part')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del question_stat\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# get the relative performance of Users on the Questions"},{"metadata":{"trusted":true},"cell_type":"code","source":"user_question_stat=train[['user_id', 'content_id', 'answered_correctly']].copy()\nuser_question_stat.rename(columns={'content_id': 'question_id'}, inplace=True)\nuser_question_stat=user_question_stat.merge(\n    question_stat[['question_id', 'num_attempted', 'percent_answered_correctly']],\n    how='inner',\n    on='question_id'\n)\n\n\nuser_question_stat.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.scatterplot(data=user_question_stat,\n                x='num_attempted',\n                y='percent_answered_correctly'\n               )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}