準備が出来たら[Shading]タブを選択し、Nキーを押すと横から[EPBR]のタブが出てくるので、そのタブを選択してから、上のツリー好きな素材を選びます。
素材を選んだら、下の[↓]アイコン(Download This Shader)を押し解像度を選択します。
適度にコーディングのことを書いていきます
準備が出来たら[Shading]タブを選択し、Nキーを押すと横から[EPBR]のタブが出てくるので、そのタブを選択してから、上のツリー好きな素材を選びます。
素材を選んだら、下の[↓]アイコン(Download This Shader)を押し解像度を選択します。
Blenderでマテリアルをすべて自分で作るのは至難の業です。
簡単に質感が出せるBlenderのアドオンEasy PBRを使ってみましょう。
まずEasy PBRのサイトから右のフォームに『0』を入力、寄付する場合は任意の価格で下の購入ボタンを押します。
するとメールアドレス登録欄が出るので自分のメールアドレスを入れます。
するとダウンロード欄に行くのでBlender 3の場合は「EasyPBR__0.9.3__Beta.zip」「EPBR_library.zip」ファイルをダウンロードします。
ダウンロードしたファイル「EPBR_library.zip」は解凍し「Easy_PBR_library」フォルダにしてから任意のフォルダに入れてください(分かりやすいようにblender\assetなど)
そうしたら準備完了! Blenderを起ち上げてから[Edit]→[Preferences]→[Add-ons]と通常のアドオンを入れる手順から右上の[Install]を押すとBlender File Viewウインドウが開くので先ほどの任意のフォルダを開きます。
そして先ほどのzipファイル「EasyPBR__0.9.3__Beta.zip」を選択し
「Material: Easy PBR」にチェックを入れ、矢印を展開すると下に「PBR Library Path:」という欄があるので、先ほど解凍した「Easy_PBR_library」フォルダを選択し[Accept]を押します。
左下の[Save Preferences]を押しセット完了です。
中心極限定理とは、
中心極限定理は標本平均と母平均との誤差を論ずるものである。多くの場合、母集団の分布がどんな分布であっても、その誤差は標本の大きさを大きくしたとき近似的に正規分布に従う。wikipedia
とあるように標本を大きくしていくと正規分布に近づくという定理です。
サイコロを想定してpythonで表現してみます。
numpyのrandintでランダムに1〜6の目を出すサイコロを回数分出します。
とりあえず10000回くらい振ってみましょう。
#! /usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import numpy as np print("[dice]") print() # サイコロの目(1〜6)をランダムにnumpy配列で出力 pip = np.random.randint(1, 7, 10000) # 作られた配列の先頭を表示 print(pip[:10]) print() print(f"平均値: %f" % pip.mean()) print()
そしてmatplotlibのヒストグラムで分布を見てみましょう。
#ヒストグラムでプロット import matplotlib.pyplot as plt import japanize_matplotlib plt.title("サイコロ") plt.xlabel("出た目") plt.ylabel("出た回数") plt.hist(pip, bins=6, ec="k") plt.show()
import pandas as pd import numpy as np import matplotlib.pyplot as plt import japanize_matplotlib #最瀕値を出すために使用 import statistics #振る回数 roll = 10000 #1つ目のサイコロ pip = np.random.randint(1, 7, roll) #2こ目のサイコロの pip2 = np.random.randint(1, 7, roll) print("[dice]") print() #先頭10回分の目 print(pip[:10]) print(pip2[:10]) sm = pip + pip2 print() print(f"平均値: %f" % sm.mean()) print(f'最瀕値: %f' % statistics.mode(sm)) plt.title("サイコロ") plt.xlabel("出た目") plt.ylabel("出た回数") plt.hist(sm, bins=11, ec="k") plt.show()
平均値: 7.044900
最瀕値: 7.000000
サイコロを2つにすると足した7が一番多い山のような形になることが分かります。
振るサイコロ6個の目の合計ではどうでしょう?
サイコロ6つだと、出る目は6の6乗の46656とおりになるので、それ以上回数を振らないとまばらな結果になりそうです。
10万回くらい振ってみましょう
#! /usr/bin/env python # -*- coding:utf-8 -*- # import pandas as pd import numpy as np import matplotlib.pyplot as plt import japanize_matplotlib #最瀕値を出すために使用 import statistics #振る回数 roll = 100000 # ndarrayの初期化 sm = np.zeros(roll) print("[dice]") for i in range(6): pip = np.random.randint(1, 7, roll) #出ための先頭10回 print(pip[:10]) sm += pip print() print(f"平均値: %f" % sm.mean()) print(f"最瀕値: %f" % statistics.mode(sm)) print() #出ための合計の種類 print(np.unique(sm)) plt.figure(figsize=(10, 8)) plt.title("サイコロ") plt.xlabel("出た目の合計") plt.ylabel("出た回数") plt.grid() plt.hist(sm, bins=31, ec="k") plt.show()
平均値: 21.013420
最瀕値: 21.000000
ほぼ正規分布に近づきました。
標本を大きくすれば正規分布に近づいていくという中心極限定理が感覚的につかめました。
フォーム要素でボタンを使用する場合、現在ではbutton要素が推奨されてます。
理由はそこら中で書いてありますが、CSSで疑似要素が使えたり、デザイン性で柔軟だからです。
ここではJavaScriptによる違いを書きます。
まずは、何もないbutton要素
何も指定しないと、type="submit"と同じ送信になり、formのaction属性と同じになります。
なのでtype="button"にしたい場合は属性を書かなければなりません。
button要素の中のテキストを取得したい場合は、input要素のようにvalueでは取得できません。button要素の文字は、タグで挟まれてるのでtextContentで取得します。
冷静に考えたら分かりますね。
submitで値を送信したい場合は、そのままvalue属性が書けます。
MeCabは日本語形態素解析システムの主要パッケージで、日本語解析によく使われます
しかしバージョンが合ってないとただimportしただけではエラーが出ます。
Python3の pip install mecab でエラーが出た場合は
$ pip install mecab-python3
$ pip install unidic-lite
でインストールしてください。
unidic-liteは辞書です。
----------------------------------------------------------
Failed initializing MeCab. Please see the README for possible solutions:
https://github.com/SamuraiT/mecab-python3#common-issues
If you are still having trouble, please file an issue here, and include the
ERROR DETAILS below:
https://github.com/SamuraiT/mecab-python3/issues
issueを英語で書く必要はありません。
------------------- ERROR DETAILS ------------------------
のようなエラーが出た場合は辞書がインストールされてません
from sklearn.linear_model import LinearRegression X = df3[['人口']] y = df3['平均年収'] # モデルの作成 model = LinearRegression() model.fit(X, y) print("傾き: %f" % model.coef_) print("切片: %f" % model.intercept_) print() print("決定係数: %f" % model.score(X, y))y = ax + b
predictを使い回帰直線を引きます。
人口と平均年収の関係はありそうですね。
predict = model.predict(X) plt.plot(x, predict, color="coral")全コード
#! /usr/bin/env python # -*- coding:utf-8 -*- # import pandas as pd import numpy as np import matplotlib.pyplot as plt import japanize_matplotlib from sklearn.linear_model import LinearRegression #日本円表示を数値に def currencyToNumber(val): # 万と千以下に分ける man, sen = val.split("万") #円を取り除き,千以下を0埋め sen = sen.replace("円", "") sen = sen.zfill(4) man += sen return int(man) # 数値のカンマを取り除く def dropComma(val): val = val.replace(",", "") return float(val) data1 = "../data/prefecture1.csv" data2 = "../data/income_pref.csv" df1 = pd.read_csv(data1) df2 = pd.read_csv(data2) print(df1.head()) print() print(df2.head()) print() df3 = pd.merge(df1, df2) print(df3.head()) print() df3['平均年収'] = df3['平均年収'].apply(currencyToNumber) df3['人口'] = df3['人口'].apply(dropComma) x = df3['人口'] X = df3[['人口']] y = df3['平均年収'] # モデルの作成 model = LinearRegression() model.fit(X, y) print("傾き: %f" % model.coef_) print("切片: %f" % model.intercept_) print() print("決定係数: %f" % model.score(X, y)) pref_name = df3['都道府県'] plt.figure(figsize=(16, 10)) predict = model.predict(X) plt.title("人口と平均年収のグラフ", fontsize=24) plt.scatter(x, y) plt.grid() plt.xlabel("人口(人)", fontsize=18) plt.ylabel("平均年収(円)", fontsize=18) plt.plot(x, predict, color="coral") for i, pref in enumerate(pref_name): plt.annotate(pref, (x[i], y[i])) nums = plt.gca().get_yticks() plt.gca().set_yticklabels(['{:,.0f}'.format(i) for i in nums]) nums = plt.gca().get_xticks() plt.gca().set_xticklabels(['{:,.0f}'.format(i) for i in nums]) out = "img/prefecture_data1.png" plt.savefig(out) plt.show()
色々なデータに触れると、相関関係があるのか確かめたくなります。
最も簡単な分析が線形回帰でよく使われています。
今回は、こちらのデータを使い都道府県と平均年収の関係を使って簡単なテストをしてみます。
import pandas as pd data1 = "prefecture1.csv" data2 = "income_pref.csv" df1 = pd.read_csv(data1) df2 = pd.read_csv(data2) print(df1.head()) print(df2.head())
# データのマージ df3 = pd.merge(df1, df2) #日本円表示を数値に def currencyToNumber(val): # 万と千以下に分ける man, sen = val.split("万") #円を取り除き,千以下を0埋め sen = sen.replace("円", "") sen = sen.zfill(4) man += sen return int(man) # 数値のカンマを取り除く def dropComma(val): val = val.replace(",", "") return float(val) # 関数を適用して数値にする df3['平均年収'] = df3['平均年収'].apply(currencyToNumber) df3['人口'] = df3['人口'].apply(dropComma) # プロットする場合はSeriesで小文字のx x = df3['人口'] # 線形回帰する場合はDataFrameで大文字のX X = df3[['人口']] # 目的変数y y = df3['平均年収']出来上がったデータを散布図としてプロットします。
import matplotlib.pyplot as plt import japanize_matplotlib # 県名が見やすいように大きめのグラフに plt.figure(figsize=(16, 10)) plt.title("人口と平均年収のグラフ", fontsize=24) #散布図 plt.scatter(x, y) plt.grid() plt.xlabel("人口(人)", fontsize=18) plt.ylabel("平均年収(円)", fontsize=18) # 点それぞれに中訳を入れる annotate pref_name = df3['都道府県'] for i, pref in enumerate(pref_name): plt.annotate(pref, (x[i], y[i])) # 数値が大きいと指数表示になるので、分かりやすく整数表示にする nums = plt.gca().get_yticks() plt.gca().set_yticklabels(['{:,.0f}'.format(i) for i in nums]) nums = plt.gca().get_xticks() plt.gca().set_xticklabels(['{:,.0f}'.format(i) for i in nums]) plt.show()