{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# struktura powiązań nazw kolumn tabeli z ich typem danych, zgodnie z zakładką Data\ntypes = {\n    'row_id': 'int64',\n    'timestamp': 'int64',\n    'user_id': 'int32',\n    'content_id': 'int16',\n    'content_type_id': 'int8',\n    'task_container_id': 'int16',\n    'user_answer': 'int8',\n    'answered_correctly': 'int8',\n    'prior_question_elapsed_time': 'float32', \n    'prior_question_had_explanation': 'boolean'\n}        \n\n# załadowanie danych, przekazanie struktury types w celu wyeliminowania dynamicznego typowania -> przyspieszenie wczytywania danych\ntrain = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/train.csv', dtype = types) # wszystkie dane ładowane do pamięci\n# train = pd.read_csv('/kaggle/input/riiid-test-answer-prediction/train.csv', dtype = types, nrows=1000) # pierwsze 1000 wierszy\n\nprint(\"Dane treningowe:\")\nprint(train.shape)\nprint(train.info())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Ilość użytkowników: ' + str(train.user_id.nunique()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(str(len(train[train.content_type_id == 0])) + ' wierszy reprezentuje pytania zadane użytkownikom')\nprint(str(len(train[train.content_type_id == 1])) + ' wierszy reprezentuje udział użytkownika w wykładzie')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('W zbiorze istnieje ' + str(train.task_container_id.nunique()) + ' grup pytań/wykładków')\n# grupa to np. seria 4 pytań/wykładów, każde pytanie/wykład z danej grupy posiada to samo task_container_id","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('Możliwe odpowiedzi na zadawane pytania:')\ntrain.user_answer.value_counts()\n# dane wskazują, że użytkownik ma do wyboru 4 odpowiedzi (pytania typu ABCD)\n# użytkownicy najchętniej wybierali odpowiedzi w kolejności: A, B, D, C\n# wartość -1 oznacza brak odpowiedzi (wykład)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure(figsize=(13,5))\nts = train.timestamp / 86400000\nts.plot.hist(bins=100)\nplt.ylabel(\"Ilość wystąpięń\")\nplt.xlabel(\"Ile dni upłynęło od pierwszej aktywności użyt. w systemie do aktywności reprezentowanej przez dany wiersz\")\nplt.show()\n\n# ograniczenie do 100 dni\nfig = plt.figure(figsize=(13,5))\naxes = plt.gca()\naxes.set_xlim([0,100])\nts.plot.hist(bins=100)\nplt.ylabel(\"Ilość wystąpięń\")\nplt.xlabel(\"Ile dni upłynęło od pierwszej aktywności użyt. w systemie do aktywności reprezentowanej przez dany wiersz\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# kolumna answered_correctly przyjmuje wartości: 1 - poprwna odpowiedź, 0 - zła odpowiedź, -1 - wykład\n# celem zadania jest ustalenie tej wartości dla danych treningowych\nno_lectures = train[train.answered_correctly != -1] # wykluczenie wykładów\ncorrect_percent = no_lectures[no_lectures.answered_correctly == 1].shape[0] / no_lectures.shape[0]\nwrong_percent = 1 - correct_percent\nlabels = ' Poprawne odpowiedzi ', ' Złe odpowiedzi '\nsizes = [correct_percent, wrong_percent]\n\nfig1, ax1 = plt.subplots()\nax1.pie(sizes, labels=labels, autopct='%1.1f%%')\nplt.title('Jak odpowiadali użytkownicy systemu?')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"no_lectures = train[train.answered_correctly != -1] # wykluczenie wykładów\nprint('Procent poprawnych odpowiedzi udzielonych na pytania z danej grupy (dla wszystkich użytkowników) wraz z ilością wprowadzonych odpowiedzi')\ndf = no_lectures.groupby(['task_container_id']).agg({'answered_correctly': ['mean', 'count']})\ndf = df['answered_correctly'].sort_values(by=['mean', 'count'], ascending=False)\nprint(df)\nprint('Najprostsze pytania pochodzą z kategorii: ' + str(df.index[0]))\nprint('Najtrudniejsze pytania pochodzą z kategorii: ' + str(df.index[-1]))\n\ndel no_lectures\ndel df\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"no_lectures = train[train.answered_correctly != -1] # wykluczenie wykładów\nprint('Procent poprawnych odpowiedzi udzielonych na pytania przez danych użytkowników, ilość pytań zadana danemu użytkownikowi')\ndf = no_lectures.groupby(['user_id']).agg({'answered_correctly': ['mean', 'count']})\ndf_mean = df['answered_correctly'].sort_values(by=['mean', 'count'], ascending=False)\nprint(df)\nprint('Najlepszy uczeń: ' + str(df_mean.index[0]))\nprint('Najgorszy uczeń: ' + str(df_mean.index[-1]))\n\ndf_count = df['answered_correctly'].sort_values(by=['count', 'mean'], ascending=False)\nprint(' ------ ')\nprint(df_count)\nprint('Najwięcej odpowiedzi: ' + str(df_count.index[0]))\nprint('Najmniej odpowiedzi: ' + str(df_count.index[-1]))\ndel no_lectures\ndel df\ndel df_mean\ndel df_count","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"no_lectures = train[train.answered_correctly != -1] # wykluczenie wykładów\ndf = no_lectures.groupby(['prior_question_had_explanation']).agg({'answered_correctly': ['mean', 'count']})\nprint('Wpływ podpowiedzi na odpowiedź')\nprint(df)\n\ndel no_lectures\ndel df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Badanie wpływu momentu zalogowania się na średnią poprawność odpowiedzi\nno_lectures = train[train.answered_correctly != -1] # wykluczenie wykładów\ndays = 100 # ile czasu użytkownik jest w systemie\nunder_n_days = no_lectures[no_lectures.timestamp <= 86400000 * days] # 86400000 ms = 1 dzień\nbeyond_n_days = no_lectures[no_lectures.timestamp > 86400000 * days]\n\ncorrect_under_n_days_percent = under_n_days[under_n_days.answered_correctly == 1].shape[0] / under_n_days.shape[0]\ncorrect_beyond_n_days_percent = beyond_n_days[beyond_n_days.answered_correctly == 1].shape[0] / beyond_n_days.shape[0]\n\nprint('Procent poprawnych odpowiedzi dla użytkowników zalogwanych w systemie...')\nprint('mniej niż ' + str(days) + ' dni: ' + str(correct_under_n_days_percent))\nprint('więcej niż ' + str(days) + ' dni: ' + str(correct_beyond_n_days_percent))\n\ndel no_lectures\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# content_id to klucz obcy dla tabeli questions/lectures, reprezentuje konkretne pytanie lub konkretny wykład\ncontent_ids_amount = train.content_id.nunique()\nprint('Istnieje ' + str(content_ids_amount) + ' różnych pytań/wykładów')\nno_lectures = train[train.content_type_id == 0]\nquestion_amount = no_lectures.content_id.nunique()\nprint('Istnieje ' + str(question_amount) + ' pytań')\nlectures_amount = content_ids_amount - question_amount\nprint('Istnieje ' + str(lectures_amount) + ' wykładków')\n\nlabels = ' pytań ', ' wykładów '\nsizes = [question_amount, lectures_amount]\n\nfig1, ax1 = plt.subplots()\nax1.pie(sizes, labels=labels, autopct='%1.1f%%')\nplt.title('Content id dla...')\nplt.show()","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}