{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "# 数字の出現数を数える\n",
    "## プログラムの概要\n",
    "あるシステムが生成する認証コードは6桁の整数です。このコードに現れる各桁の数字(Digit)の分布がどの程度一様なのかを調べます。\n",
    "実際に生成されたコードの一覧から、各桁の数字に分解して頻度を数えます。\n",
    "まずは生成されたcodeの一覧を変数`codes`に割り当てます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "#!python3\n",
    "#-*- coding:utf-8 -*-\n",
    "# '#'以降は行末までがコメントになります。（プログラムとしては実行されない）\n",
    "nlen=6 # コードの桁数は6桁\n",
    "codes=(\n",
    "    # 012345 のように0から始まるcodeは, 0を省いて書くことにします。\n",
    "    227524,  463251,  702567,  601620,\n",
    "    129458,  413239,  629380,  526093,\n",
    "    261547,  666552,  853626,  513298,\n",
    "    142167,  612906,  995697,  660500,\n",
    "    954404,  651454,  566439,  730975,\n",
    "    578967,  603424,  435636,  891667,\n",
    "    757294,  325567,  131075,  757309, \n",
    "    198547,  542718,  511525,  357679,\n",
    "    245280,\n",
    "    # 2021/05/14\n",
    "     40245, 314151, 689785, 246930, 429093,\n",
    "    546479, 240262, 631261, 559379, 869925, \n",
    "    814588, 766660, 588608, 815828, 946364,\n",
    "    542718, 710428, 725610, 863406, 250107, \n",
    "    629444, 865116,  86879, \n",
    "    # 2021/07/21\n",
    "    162227, 132001, 167877, 898784, 225402,\n",
    "    732262, 403174, 483069,  73898, 990700,\n",
    "    272303, 489913, 473568, 662501, 590176, \n",
    "    631682, 633141, 714916, 944273, 211866,\n",
    "    803916,  13252, 106412, 319172, 339634,\n",
    "    752409, 570635, 265899, 944273, 211866\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
    "次に一つの code の各桁に現れる数字の出現回数を数えます。\n",
    "一番下の桁から順番にみていきます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def count_digits(code,nlen=6): #　関数　`count_digits`を定義します。\n",
    "    # 最大二つの引数を持ちますが、二つ目の引数`nlen`は省略可能で、\n",
    "    # 省略された場合の値(既定値)は6です。\n",
    "    acc={} #これに数字毎の出現回数を入れていきます。\n",
    "    code=code+10**nlen # 最上位が0の場合を取り扱うために、10**nlenを足しておく。\n",
    "    # code =227524 であれば　code=1227524とするということ。\n",
    "    while code>=10:\n",
    "        code, d=divmod(code, 10) #商 `code` と余り `d` に分解します。\n",
    "        # code=1227524　=> code=122752,d=4\n",
    "        acc[d]=acc.get(d,0)+1 \n",
    "        # accのkeyにdがあればその値に1を足したもの、さもなければ 0+1をacc[d]に設定する。\n",
    "    return acc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
    "一覧表`codes`の全ての`code`に現れる数字に頻度を数えて、足していきます。\n",
    "結果の度数分布表`acc`を関数の値として返します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "def count_digits_in_list(codes,nlen):\n",
    "    acc={}\n",
    "    for code in codes: #codesの中に入っている全てのcodeについて\n",
    "        count=count_digits(code,nlen) #コードの中の数字の出現表を作る。\n",
    "        for d in count: #codeでの数字の出現数をaccに足して行く。\n",
    "            acc[d]=acc.get(d,0)+count[d]\n",
    "    return acc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "source": [
    "`codes`の中の数字の度数分表を印刷し、ヒストグラムを表示させてみます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as pyplot #グラフ作成の準備のおまじない\n",
    "import numpy\n",
    "\n",
    "def main():\n",
    "    counts=count_digits_in_list(codes,nlen) #codeの一覧codesから数字の出現数の表を作成する。\n",
    "    print(\"digit:  count\")# 印刷する表のラベルを印刷する。\n",
    "    for d in sorted(counts): # 出現表にあらわれる数字を整列させた順番に、\n",
    "        print (d,\":\",counts[d]) # 数字(d)とその出現数(count[d])を印刷する。\n",
    "    # print(\"average:\",len(codes)*nlen/10) #数字の出現数の平均値を印刷する。\n",
    "    print(\"average:\", sum(counts.values())/len(counts)) # 6*len(codes)/10\n",
    "    print(\"std. dev:{:4.1f}\".format(numpy.std(list(counts.values()))))\n",
    "    pyplot.bar(counts.keys(),counts.values()) # barグラフを印刷する。\n",
    "    pyplot.draw() #グラフ作成のおまじない\n",
    "    pyplot.show() #グラフ作成の最後のおまじない. Jupyter Notebookでは不要\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "digit:  count\n",
      "0 : 45\n",
      "1 : 53\n",
      "2 : 61\n",
      "3 : 44\n",
      "4 : 52\n",
      "5 : 54\n",
      "6 : 71\n",
      "7 : 48\n",
      "8 : 41\n",
      "9 : 47\n",
      "average: 51.6\n",
      "std. dev: 8.5\n"
     ]
    },
    {
     "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": [
    "#ファイルをコマンドとして実行するためのおまじない\n",
    "if __name__ == \"__main__\":\n",
    "    main()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## pandas/DataFrame\n",
    "Data Analysis分野で最近よく使われるDataFrameオブジェクトを使うと、\n",
    "短いプログラムでデータのリストから度数分表を取出し、またヒストグラムを表示させることができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "import pandas # DataFrameが使えるようにpandasをインポートして置きます。\n",
    "\n",
    "def split_digits(code,nlen=6):\n",
    "    acc=[] # あらわれた数字を順番に保存する。\n",
    "    code=code+10**nlen # 最上位が0の場合を取り扱うため\n",
    "    while code>=10:\n",
    "        code,d=divmod(code,10)\n",
    "        acc.insert(0,d)\n",
    "    return acc\n",
    "\n",
    "def split_codes():\n",
    "    acc=[]\n",
    "    for code in codes:\n",
    "        acc +=split_digits(code)\n",
    "    return acc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    45\n",
      "1    53\n",
      "2    61\n",
      "3    44\n",
      "4    52\n",
      "5    54\n",
      "6    71\n",
      "7    48\n",
      "8    41\n",
      "9    47\n",
      "dtype: int64\n",
      "average: 51.6\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='0'>"
      ]
     },
     "execution_count": 7,
     "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": [
    "# codesのデータを一桁の数字に分解し、リストをつくります\n",
    "\n",
    "df=pandas.DataFrame(split_codes()).value_counts(sort=False)\n",
    "print(df)\n",
    "print(\"average:\",numpy.average(df))\n",
    "df.plot.bar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": []
   },
   "source": [
    "## matplotlib.pyplot\n",
    "\n",
    "matplotlib.pyplotを使って、ヒストグラムの表示と度数分布を求めることも可能です。\n",
    "\n",
    "まずヒストグラムを作成します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    },
    "tags": []
   },
   "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": [
    "counts, digits, chart = pyplot.hist(\n",
    "    split_codes(), \n",
    "    bins=range(0,11)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "matplotlib.hist()関数は、ビン毎の計数値(count)、binの端の値(digits)そして、ヒストグラムのオブジェクトを値として返してきます。ですから、次のようなスクリプトで、各ビンのラベルと係数値を印刷します。digitsの要素数はcountsの要素数より1多いことに注意が必要です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0, 45.0)\n",
      "(1, 53.0)\n",
      "(2, 61.0)\n",
      "(3, 44.0)\n",
      "(4, 52.0)\n",
      "(5, 54.0)\n",
      "(6, 71.0)\n",
      "(7, 48.0)\n",
      "(8, 41.0)\n",
      "(9, 47.0)\n",
      "average: 51.6\n",
      "11 > 10\n"
     ]
    }
   ],
   "source": [
    "for p in (zip(digits,counts)):\n",
    "    print(p)\n",
    "print(\"average:\", sum(counts)/len(counts))\n",
    "print(len(digits), \">\",len(counts))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "次に、数字の出現回数の分布をプロットしてみます。\"5\"および\"6\"の出現回数が突出していることが\n",
    "見て取れます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "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": [
    "pyplot.hist(\n",
    "    counts, \n",
    "    histtype=\"stepfilled\",\n",
    "    density=False,\n",
    "    align=\"left\",\n",
    "    bins=range(34-3*8,34+3*8,2),\n",
    ")\n",
    "pyplot.gca().set_xlabel(\"count\")\n",
    "pyplot.gca().set_ylabel(u\"occurence\");"
   ]
  }
 ],
 "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.9.6"
  },
  "toc-autonumbering": true,
  "toc-showcode": false,
  "toc-showmarkdowntxt": true,
  "toc-showtags": false
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
