Anki Forums

"Statistics" section - Graph of Answers value vs answer per session

Hi,
I’m using Anki (via Ankidroid) regularly and am enjoying the “statistics section” to encourage me go further.

For this reason, what would you think of adding one graph to your stats, namely, adding a graph, for the latest session, that reports the answer’s quality for each question of the last session?

This graph could help seeking when one is not concentrate.
For example, I have the feeling my answers are sharp at the beginning of the session, then gets less good (qualitatively) in the middle, and are getting better while reaching the end.
In other words, with this graph, I could confirm I have to keep my concentration in the middle (or unconfirm :wink: )

It could look like:
example 1:


example 2:

(personnally, i prefer example 2)
In these plots, the trend line informs us that the concentration quality (if related to the answer correctness) is great in the beginning, then reducing from 25 till 43 and finally re-increasing.

Obviously, I would even be more interested to have this on AnkiDroid but I understood that they try to be 100% conform to AnkiDesktop and therefore, I send you this suggestion.
(Note it can be linked to the feature request done on AnkiDroid: https://github.com/ankidroid/Anki-Android/issues/8743

Have a nice day and thanks anyway for the great app!

ps: if needed, the python code to produce these plots:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# Functions
def cumulVect(answerVal, val):
  vect = np.zeros_like(answerVal)
  counter = 0
  for id,ii in enumerate(answerVal):
    if ii == val:
      counter += 1
    vect[id] = counter
  return vect

def vectSep(answerVal, val):
  vect = np.zeros_like(answerVal)
  for id,ii in enumerate(answerVal):
    if ii == val:
      vect[id] = val
  return vect

# Main
nbAnswer = 50
ansId = np.arange(nbAnswer) + 1
np.random.seed(1729)
answerVal = np.random.randint(4, size=(nbAnswer)) + 1
# answerVal = np.array([3, 4, 3, 3, 3, 3, 4, 3, 3, 3, 2, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 4, 3, 4, 4, 3, 4, 3, 3])

# fitting curve
def func(x, a, b, c, d):
    return a*x**3 + b*x**2 + c*x + d
popt, pcov = curve_fit(func, ansId, answerVal)
fit = func(ansId, *popt)


width = 0.35
again = cumulVect(answerVal, 1) / nbAnswer * 4
hard = cumulVect(answerVal, 2) / nbAnswer * 4
good = cumulVect(answerVal, 3) / nbAnswer * 4
easy = cumulVect(answerVal, 4) / nbAnswer * 4

againSep = vectSep(answerVal, 1)
hardSep = vectSep(answerVal, 2)
goodSep = vectSep(answerVal, 3)
easySep = vectSep(answerVal, 4)

# Plots
fig = plt.figure(figsize=[10,5], dpi=100, tight_layout=True)
ax = fig.add_subplot()

# # Cumulative version
# ax.bar(ansId, again, width, color='r')
# ax.bar(ansId, hard, width,bottom=again, color='#929292')
# ax.bar(ansId, good, width,bottom=again+hard, color='g')
# ax.bar(ansId, easy, width,bottom=again+hard+good, color='b')
# ax.plot(ansId, answerVal, 'o-', color='orange', linewidth = 2, label="Correctness")
# ax.plot(ansId, fit, '--', color='red', linewidth = 5, alpha=0.5, label="Trend")

# Separate version (better)
ax.bar(ansId, againSep, width, color='r')
ax.bar(ansId, hardSep, width, color='#929292')
ax.bar(ansId, goodSep, width, color='g')
ax.bar(ansId, easySep, width, color='b')
ax.plot(ansId, fit, '--', color='red', linewidth = 5, alpha=0.5, label="Trend")

ax.legend()
ax.set_title('Answers quality for the last session ({ans} questions done)'.format(ans=nbAnswer))
ax.set_ylabel('Questions\' answer')
ax.set_xlabel('Questions\' log')
ax.set_xticks(ansId)
ax.set_yticks([1, 2, 3, 4])
ax.set_yticklabels(['AGAIN', 'HARD', 'GOOD', 'EASY'])

plt.savefig('ankidroidStatQLog.png')
plt.show()