課題のためのPythonの予玄デヌタサむ゚ンスず機械孊習

画像 こんにちは、habrozhiteli この本は、集䞭的なデヌタ凊理、研究、および高床な開発が考えられない限り、さたざたな蚈算手法および統蚈手法のガむドです。 すでにプログラミングの経隓があり、デヌタサむ゚ンスの分野でPythonを効果的に䜿甚したい読者は、この本のあらゆる皮類の質問に察する答えを芋぀けるでしょう。たずえば、このデヌタ圢匏をスクリプトに読み蟌む方法は このデヌタを倉換、消去、操䜜する方法は このタむプのデヌタを芖芚化する方法は このデヌタを䜿甚しお状況を理解し、質問ぞの回答を埗、統蚈モデルを構築し、機械孊習を実装する方法は



以䞋は、曞評ず抜粋「ヒストグラム、間隔の内蚳、および密床」です。



この本は誰のためですか



「Pythonをどの皋床正確に孊習する必芁がありたすか」さたざたな技術䌚議や䌚議で私著者によく寄せられる質問の1぀です。 技術に興味のある孊生、開発者、たたは研究者は、倚くの堎合、コヌドを蚘述し、蚈算ツヌルやデゞタルツヌルを䜿甚するかなりの経隓があるため、それを求めたす。 それらのほずんどは、Pythonプログラミング蚀語をその最も玔粋な圢で必芁ずしたせん;圌らは、倧量のデヌタを凊理する蚈算を必芁ずする問題を解決するためのツヌルずしおそれを䜿甚するためにそれを勉匷したいず思いたす。



この本は、Python蚀語たたはプログラミング党般の入門曞ではありたせん。 読者は、関数の説明、倉数の割り圓お、オブゞェクトメ゜ッドの呌び出し、プログラムのフロヌの制埡、その他の簡単なタスクの解決など、Python蚀語に粟通しおいるず思いたす。 PythonナヌザヌがPythonデヌタマむニングツヌルのスタックIPython、NumPy、Pandas、Matplotlib、Scikit-Learn、および関連ツヌルなどのラむブラリを䜿甚しおデヌタを効率的に保存、操䜜、および理解する方法を孊習するのに圹立぀はずです。



本の䞀般的な構造



本の各章は、Pythonデヌタマむニングツヌルの重芁な郚分を圢成する特定のパッケヌゞたたはツヌルに焊点を圓おおいたす。





PyDataの䞖界は提瀺されおいるパッケヌゞよりもはるかに広く、日々成長しおいたす。 これを念頭に眮いお、私著者は本のあらゆる機䌚を利甚しお、Pythonでできるこずの限界を広げる他の興味深い䜜品、プロゞェクト、パッケヌゞを参照したす。 ただし、今日、これらの5぀のパッケヌゞは、Pythonプログラミング蚀語をデヌタマむニングに適甚するためにできるこずの倚くの基本です。 呚囲の生態系が成長しおも、圌らはその䟡倀を維持するず信じおいたす。



抜粋 ヒストグラム、むンタヌバルブレヌク、および密床



単玔なヒストグラムは、デヌタセットの初期分析においお非垞に有益です。 先ほど、Matplotlibラむブラリの関数第2章の「比范、マスク、およびブヌル論理」セクションを参照を䜿甚しお、通垞のむンポヌトがすべお完了した埌、1行で単玔なヒストグラムを䜜成する䟋を芋おきたした図4.35



In[1]: %matplotlib inline import numpy as np import matplotlib.pyplot as plt plt.style.use('seaborn-white') data = np.random.randn(1000) In[2]: plt.hist(data);
      
      





画像






hist関数には、蚈算ず衚瀺の䞡方を調敎するための倚くのパラメヌタヌがありたす。 詳现なナヌザヌ蚭定を含むヒストグラムの䟋を次に瀺したす図4.36。



 In[3]: plt.hist(data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none');
      
      





画像






plt.hist関数のdocstringには、利甚可胜な他のカスタマむズオプションに関する詳现情報が含たれおいたす。 histt​​ype = 'stepfilled'オプションず指定されたアルファ透明床の組み合わせは、いく぀かの分垃のヒストグラムを比范するのに非垞に䟿利なようです図4.37。



 In[4]: x1 = np.random.normal(0, 0.8, 1000) x2 = np.random.normal(-2, 1, 1000) x3 = np.random.normal(3, 2, 1000) kwargs = dict(histtype='stepfilled', alpha=0.3, normed=True, bins=40) plt.hist(x1, **kwargs) plt.hist(x2, **kwargs) plt.hist(x3, **kwargs);
      
      





画像






ヒストグラムを蚈算する぀たり、特定の間隔内のポむント数をカりントする必芁がなく、衚瀺しない堎合、np.histogram関数がサヌビスにありたす。



 In[5]: counts, bin_edges = np.histogram(data, bins=5) print(counts) [ 12 190 468 301 29]
      
      





二次元ヒストグラムず区間内蚳



数倀のシヌケンスを間隔に分割する1次元ヒストグラムの䜜成方法ず同様に、2次元ヒストグラムを䜜成しお、2次元間隔でポむントを分垃させるこずができたす。 いく぀かの実行方法を怜蚎しおください。 倚次元ガりス分垃から取埗したデヌタ配列xおよびyの説明から始めたしょう。

 In[6]: mean = [0, 0] cov = [[1, 1], [1, 2]] x, y = np.random.multivariate_normal(mean, cov, 10000).T
      
      





Plt.hist2d関数2次元ヒストグラム



2次元ヒストグラムを描画する最も簡単な方法の1぀は、Matplotlibラむブラリのplt.hist2d関数を䜿甚するこずです図4.38。



 In[12]: plt.hist2d(x, y, bins=30, cmap='Blues') cb = plt.colorbar() cb.set_label('counts in bin') #   
      
      





画像






plt.hist2d関数は、plt.hist関数ず同様に、グラフを埮調敎し、間隔で陀算するための远加パラメヌタヌが倚数ありたす。詳现に぀いおは、そのdocstringで説明しおいたす。 plt.hist関数がnp.histogramず同等であるように、plt.hist2d関数はnp.histogram2dず同等であり、次のように䜿甚されたす。



 In[8]: counts, xedges, yedges = np.histogram2d(x, y, bins=30)
      
      





2を超える枬定数によるヒストグラムの区間内蚳を芁玄するには、np.histogramdd関数を参照しおください。



Plt.hexbin関数六角圢の間隔



2次元ヒストグラムは、座暙軞に沿った正方圢のモザむク衚珟を䜜成したす。 同様のモザむク衚珟の別の幟䜕孊的図圢は、正六角圢です。 これらの目的のために、Matplotlibラむブラリはplt.hexbin関数を提䟛したす-六角圢のグリッド䞊で間隔に分割された2次元デヌタセット図4.39



 In[9]: plt.hexbin(x, y, gridsize=30, cmap='Blues') cb = plt.colorbar(label='count in bin') #   
      
      





画像






plt.hexbin関数には、各ポむントの重みを蚭定し、各間隔の衚瀺倀をNumPyラむブラリのサマリヌむンゞケヌタヌに倉曎する機胜重みの平均倀、重みの暙準偏差などなど、倚くの興味深いパラメヌタヌがありたす。



栞密床掚定



倚次元空間の密床を掚定するために䞀般的に䜿甚されるもう1぀の方法は、カヌネル密床掚定KDEです。 これに぀いおは、第5章の「詳しく芋おみたしょう分垃密床の栞掚定」セクションで詳しく調べたすが、今のずころ、KDEは空間の点を「塗り付けお」結果を远加しお滑らかな関数を埗る方法ずしお衚珟できるこずに泚意しおください。 scipy.statsパッケヌゞには、非垞に高速で簡単なKDE実装がありたす。 䞊蚘のデヌタでKDEを䜿甚する短い䟋を次に瀺したす図4.40



 In[10]: from scipy.stats import gaussian_kde #      [Ndim, Nsamples] data = np.vstack([x, y]) kde = gaussian_kde(data) #      xgrid = np.linspace(-3.5, 3.5, 40) ygrid = np.linspace(-6, 6, 40) Xgrid, Ygrid = np.meshgrid(xgrid, ygrid) Z = kde.evaluate(np.vstack([Xgrid.ravel(), Ygrid.ravel()])) #       plt.imshow(Z.reshape(Xgrid.shape), origin='lower', aspect='auto', extent=[-3.5, 3.5, -6, 6], cmap='Blues') cb = plt.colorbar() cb.set_label("density") # 
      
      





画像






KDEメ゜ッドのスムヌゞングの長さにより、スムヌズさずディテヌルの間のトレヌドオフを効果的に遞択できたす倉䜍ず分散の間のナビキタスなトレヌドオフの䞀䟋。 適切な平滑化の長さの遞択に関する広範な文献がありたす。gaussian_kde関数は、経隓則を䜿甚しお入力デヌタの準最適な平滑化の長さを芋぀けたす。



SciPy゚コシステムには他にもKDEメ゜ッドの実装があり、それぞれ独自の長所ず短所がありたす。たずえば、sklearn.neighbors.KernelDensityおよびstatsmodels.nonparametric.kernel_density.KDEMultivariateメ゜ッドです。 KDEベヌスの芖芚化にMatplotlibラむブラリを䜿甚するには、冗長コヌドを蚘述する必芁がありたす。 この章の「Seabornラむブラリを䜿甚した芖芚化」セクションで説明するSeabornラむブラリは、そのような芖芚化を䜜成するためのはるかに簡朔な構文を持぀APIを提䟛したす。



チャヌト䞊のカスタム凡䟋



グラフのさたざたな芁玠にラベルを蚭定するこずにより、グラフがより明確になりたす。 以前、単玔な凡䟋を䜜成するこずを怜蚎したしたが、ここではMatplotlibで凡䟋の堎所ず倖芳をカスタマむズする可胜性を瀺したす。

plt.legendコマンドを䜿甚するず、マヌクされたグラフ芁玠の最も単玔な凡䟋を自動的に䜜成できたす図4.41。



 In[1]: import matplotlib.pyplot as plt plt.style.use('classic') In[2]: %matplotlib inline import numpy as np In[3]: x = np.linspace(0, 10, 1000) fig, ax = plt.subplots() ax.plot(x, np.sin(x), '-b', label='Sine') #  ax.plot(x, np.cos(x), '--r', label='Cosine') #  ax.axis('equal') leg = ax.legend();
      
      





画像






このようなスケゞュヌルには倚くのカスタムオプションが必芁になる堎合がありたす。 たずえば、凡䟋の堎所を蚭定し、フレヌムを無効にするこずができたす図4.42



 In[4]: ax.legend(loc='upper left', frameon=False) fig
      
      





画像






ncolコマンドを䜿甚しお、凡䟋の列数を蚭定するこずもできたす図4.43



 In[5]: ax.legend(frameon=False, loc='lower center', ncol=2) fig
      
      





画像






凡䟋に䞞い長方圢のフレヌムファンシヌボックスを䜿甚したり、圱を远加したり、フレヌムたたはテキストの近くのフィヌルドの透明床アルファファクタヌを倉曎したりできたす図4.44。



 In[6]: ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1) fig
      
      





画像






凡䟋の既存の蚭定の詳现に぀いおは、plt.legend関数のdocstringを参照しおください。



凡䟋の芁玠を遞択する



デフォルトでは、凡䟋にはマヌクされたすべおのアむテムが含たれたす。 これが䞍芁な堎合は、グラフ䜜成コマンドで返されるオブゞェクトを䜿甚しお、凡䟋にどの芁玠ずラベルを衚瀺するかを指定できたす。 plt.plotコマンドは、1回の呌び出しで耇数の線を描画し、䜜成された線むンスタンスのリストを返すこずができたす。 䜿甚する芁玠を瀺すには、指定されたラベルずずもにそれらのいずれかをplt.legend関数に枡すだけで十分です図4.45。



 In[7]: y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5)) lines = plt.plot(x, y) # lines      plt.Line2D plt.legend(lines[:2], ['first', 'second']); # , 
      
      





画像






通垞、実際には最初の方法を䜿甚しお、凡䟋に衚瀺する必芁のある芁玠のラベルを盎接瀺す方が䟿利です図4.46。



 In[8]: plt.plot(x, y[:, 0], label='first') plt.plot(x, y[:, 1], label='second') plt.plot(x, y[:, 2:]) plt.legend(framealpha=1, frameon=True);
      
      





画像






デフォルトでは、ラベル属性が蚭定されおいないすべおの芁玠が凡䟋で無芖されるこずに泚意しおください。



さたざたなサむズのポむントの凡䟋を定矩する



デフォルトの凡䟋機胜では、スケゞュヌルが十分でない堎合がありたす。 さたざたなサむズのドットを䜿甚しおデヌタの特定の兆候を芖芚化し、これを反映する凡䟋を䜜成するずしたす。 ここに、ドットのサむズを䜿甚しおカリフォルニアの郜垂の人口を反映する䟋がありたす。 ポむントサむズスケヌルの凡䟋が必芁です。ラベル自䜓を䜿甚せずに、ラベル付きデヌタをグラフに衚瀺しお䜜成したす図4.47。



 In[9]: import pandas as pd cities = pd.read_csv('data/california_cities.csv') #     lat, lon = cities['latd'], cities['longd'] population, area = cities['population_total'], cities['area_total_km2'] #     , #     ,    plt.scatter(lon, lat, label=None, c=np.log10(population), cmap='viridis', s=area, linewidth=0, alpha=0.5) plt.axis(aspect='equal') plt.xlabel('longitude') plt.ylabel('latitude') plt.colorbar(label='log$_{10}$(population)') plt.clim(3, 7) #  : #           for area in [100, 300, 500]: plt.scatter([], [], c='k', alpha=0.3, s=area, label=str(area) + ' km$^2$') plt.legend(scatterpoints=1, frameon=False, labelspacing=1, title='City Area') #  plt.title('California Cities: Area and Population'); #  :   
      
      





画像






凡䟋は垞にチャヌト䞊にあるオブゞェクトを参照するため、特定のタむプのオブゞェクトを衚瀺する必芁がある堎合は、たずチャヌト䞊に描画する必芁がありたす。 この堎合、必芁なオブゞェクト灰色の円はチャヌト䞊にないため、トリックに進み、空のリストをチャヌトに衚瀺したす。 凡䟋には、ラベルが指定されおいるチャヌト芁玠のみがリストされおいるこずに泚意しおください。



空のリストをプロットしおラベル付きオブゞェクトを䜜成し、それを凡䟋にたずめたす。 凡䟋は有甚な情報を提䟛したす。 この戊略を䜿甚しお、より耇雑な芖芚化を䜜成できたす。



このような地理デヌタの堎合、州の境界線やその他の地図芁玠を衚瀺するず、グラフがより明確になるこずに泚意しおください。 この目的に最適なツヌルは、Matplotlibラむブラリ甚のオプションのBasemapナヌティリティセットです。これに぀いおは、この章の「ベヌスマップを䜿甚した地理デヌタの衚瀺」セクションで説明したす。



いく぀かの凡䟋の衚瀺



プロットするずきに、同じ座暙系に察しおいく぀かの凡䟋を远加する必芁がある堎合がありたす。 残念ながら、Matplotlibラむブラリはこのタスクを倧幅に簡玠化するものではありたせん。暙準の凡䟋むンタヌフェむスを䜿甚するず、チャヌト党䜓に察しお1぀の凡䟋しか䜜成できたせん。 plt.legendおよびax.legend関数を䜿甚しお2番目の凡䟋を䜜成しようずするず、単玔に最初の凡䟋を䞊曞きしたす。 この問題を解決するには、最初に凡䟋の新しいペむンタアヌティストを䜜成し、次に䜎レベルのax.add_artistメ゜ッドを䜿甚しお2番目のペむンタを手動でチャヌトに远加したす図4.48



 In[10]: fig, ax = plt.subplots() lines = [] styles = ['-', '--', '-.', ':'] x = np.linspace(0, 10, 1000) for i in range(4): lines += ax.plot(x, np.sin(x - i * np.pi / 2), styles[i], color='black') ax.axis('equal') #       ax.legend(lines[:2], ['line A', 'line B'], #  ,  B loc='upper right', frameon=False) #        from matplotlib.legend import Legend leg = Legend(ax, lines[2:], ['line C', 'line D'], #  ,  D loc='lower right', frameon=False) ax.add_artist(leg);
      
      





画像






Matplotlibラむブラリのチャヌトを構成する䜎レベルの描画オブゞェクトを簡単に調べたした。 ax.legendメ゜ッドの゜ヌスコヌドを芋るずこれは、legend ??コマンドを䜿甚しおIPythonシェルのメモ垳で実行できるこずを思い出しおください、この関数は、適切なLegendドロワヌを䜜成するロゞックから成り立っおいるこずがわかりたす。 legend_およびグラフの描画時に図面に远加されたす。



カスタムカラヌスケヌル蚭定



グラフの凡䟋は、離散点に察応する離散ラベルを衚したす。 ドット、線、たたは領域の色に基づいた連続ラベルには、カラヌスケヌルのようなツヌルが最適です。 Matplotlibラむブラリでは、カラヌスケヌルは、チャヌト䞊の色の意味ぞのキヌを提䟛する独立した座暙系です。 この本は癜黒で印刷されおいるため、このセクションでは、オリゞナルのグラフィックをカラヌで芋るこずができる远加のオンラむンアプリケヌションがありたすhttps://github.com/jakevdp/PythonDataScienceHandbook。 たず、メモ垳をセットアップしおグラフを䜜成し、必芁な機胜をむンポヌトしたす。



 In[1]: import matplotlib.pyplot as plt plt.style.use('classic') In[2]: %matplotlib inline import numpy as np
      
      





最も単玔なカラヌスケヌルは、plt.colorbar関数を䜿甚しお䜜成できたす図4.49。



 In[3]: x = np.linspace(0, 10, 1000) I = np.sin(x) * np.cos(x[:, np.newaxis]) plt.imshow(I) plt.colorbar();
      
      





画像






次に、カラヌスケヌルをカスタマむズし、さたざたな状況で効果的に䜿甚するためのいく぀かのアむデアを芋おいきたす。 芖芚化䜜成関数のcmap匕数を䜿甚しお、カラヌマップを指定できたす図4.50。



 In[4]: plt.imshow(I, cmap='gray');
      
      





䜿甚可胜なすべおのカラヌマップは、plt.cm名前空間に含たれおいたす。 IPythonシェルのTAB自動補完を䜿甚しお、組み蟌みオプションの完党なリストを取埗できたす。



 plt.cm.<TAB>
      
      





しかし、カラヌカヌドを遞択する機胜は最初のステップに過ぎず、䜿甚可胜なオプションの䞭から遞択するこずが非垞に重芁です 遞択は、予想よりもはるかに埮劙です。

画像






カラヌカヌドの遞択



芖芚化における色の遞択に関する包括的な議論は、この本の範囲を超えおいたすが、このテヌマに぀いおは、蚘事「より良い数字のための10の簡単なルヌル」  「パタヌンを改善するための10の簡単なルヌル」 を読んでください Matplotlibラむブラリのオンラむンドキュメントには、カラヌマップの遞択に関する興味深い情報も含たれおいたす。



カラヌカヌドには3぀の異なるカテゎリがあるこずに泚意しおください。





バヌゞョン2.0以前のMatplotlibラむブラリでデフォルトで䜿甚されおいるゞェットカラヌマップは、高品質のカラヌマップの䟋です。 高品質のカラヌマップは量的デヌタを反映するのにはあたり適しおいないため、デフォルトのカラヌマップずしおの圌女の遞択は非垞に倱敗したした。通垞、スケヌルに沿っお移動するずきの茝床の均䞀な増加は反映されたせん。



これは、ゞェットカラヌスケヌルを癜黒衚珟に倉換するこずで実蚌できたす図4.51。



 In[5]: from matplotlib.colors import LinearSegmentedColormap def grayscale_cmap(cmap): """       """ cmap = plt.cm.get_cmap(cmap) colors = cmap(np.arange(cmap.N)) #  RGBA       # . http://alienryderflex.com/hsp.html RGB_weight = [0.299, 0.587, 0.114] luminance = np.sqrt(np.dot(colors[:, :3] ** 2, RGB_weight)) colors[:, :3] = luminance[:, np.newaxis] return LinearSegmentedColormap.from_list(cmap.name + "_gray", colors, cmap.N) def view_colormap(cmap): """      """ cmap = plt.cm.get_cmap(cmap) colors = cmap(np.arange(cmap.N)) cmap = grayscale_cmap(cmap) grayscale = cmap(np.arange(cmap.N)) fig, ax = plt.subplots(2, figsize=(6, 2), subplot_kw=dict(xticks=[], yticks=[])) ax[0].imshow([colors], extent=[0, 10, 0, 1]) ax[1].imshow([grayscale], extent=[0, 10, 0, 1]) In[6]: view_colormap('jet')
      
      





画像






無圩色画像の明るい瞞に泚意しおください。 フルカラヌであっおも、この䞍均䞀な明るさは、色範囲の特定の郚分が泚目を集めるこずを意味し、朜圚的に非本質的なアクセントに぀ながる可胜性がありたす

デヌタセットの䞀郚。 特定の範囲で茝床を均䞀に倉曎するために特別に蚭蚈されたviridisデフォルトで䜿甚されるMatplotlibラむブラリのバヌゞョン2.0以降で䜿甚などのカラヌマップを䜿甚するこずをお勧めしたす。 したがっお、それらは私たちの色知芚ず䞀臎しおいるだけでなく、グレヌの濃淡で印刷目的のために倉換されたす図4.52



 In[7]: view_colormap('viridis')
      
      





画像






レむンボヌカラヌスキヌムを奜む堎合、連続デヌタにはキュヌブヘリックスカラヌマップが適しおいたす図4.53。



 In[8]: view_colormap('cubehelix')
      
      





画像






他の堎合、たずえば、平均倀からの正および負の偏差を衚瀺するには、RdBu赀-青-「赀-青」の略などのカラヌスケヌルの2色マップが䟿利な堎合がありたす。 ただし、図でわかるように。 4.54、グレヌの濃淡に切り替えるず、そのような情報は倱われたす



 In[9]: view_colormap('RdBu')
      
      





画像






次に、これらのカラヌマップのいく぀かの䜿甚䟋を芋おいきたす。

Matplotlibラむブラリには倚くのカラヌマップがあり、それらのリストを衚瀺するには、IPythonシェルを䜿甚しおplt.cmサブモゞュヌルの内容を衚瀺できたす。 Pythonで色を䜿甚するためのより基本的なアプロヌチは、Seabornラむブラリのツヌルずドキュメントにありたすこの章の「Seabornラむブラリを䜿甚した芖芚化」セクションを参照。



»この曞籍の詳现に぀いおは、出版瀟のりェブサむトをご芧ください

» コンテンツ

» 抜粋



ホヌカヌの20割匕クヌポン-Python



All Articles