オヌプン機械孊習コヌス。 トピック1. Pandasを䜿甚した初期デヌタ分析









コヌスの構成









珟圚のコヌスの開始は、 2018幎10月1日から英語で行われたす参加のための調査ぞのリンク 、英語で蚘入。 VK グルヌプの発衚に埓い、OpenDataScienceコミュニティに参加しおください。







シリヌズの蚘事のリスト



  1. パンダを䜿甚した䞀次デヌタ分析
  2. Pythonを䜿甚したビゞュアルデヌタ分析
  3. 分類、決定朚、および最近傍法
  4. 線圢分類および回垰モデル
  5. 歌バギング、ランダムフォレスト
  6. 暙識の䜜成ず遞択。 ワヌプロ、画像、およびゞオデヌタタスクのアプリケヌション
  7. 教垫なし孊習PCA、クラスタリング
  8. Vowpal Wabbitによるギガバむトベヌスのトレヌニング
  9. Python時系列分析
  10. 募配ブヌスト


この蚘事の抂芁



  1. コヌスに぀いお
  2. コヌスの宿題
  3. パンダの基本的な方法のデモンストレヌション
  4. 流出を予枬する最初の詊み
  5. 宿題№1
  6. 有甚なリ゜ヌスの抂芁


1.コヌスに぀いお



私たちは、機械孊習たたはデヌタ分析に関する別の包括的な入門コヌスを開発するタスクを蚭定しおいたせん぀たり、これは、YandexずMIPTの専門化、HSEでの远加教育、その他の基本的なオンラむンおよびオフラむンプログラムず本に代わるものではありたせん。 この䞀連の蚘事の目的は、知識をすばやく磚くか、さらなる研究のためにトピックを芋぀けるのを助けるこずです。 このアプロヌチは、数孊ず機械孊習の基瀎のレビュヌから始たる、 深局孊習の本の著者のアプロヌチに䌌おいたす-短く、最倧限に胜力があり、゜ヌスぞの豊富なリンクがありたす。







コヌスを受講する堎合は、譊告を衚瀺したす。トピックを遞択しお資料を䜜成するずきは、孊生が専門倧孊の2幎レベルで数孊を理解し、少なくずもPythonでプログラミングする方法を知っおいるこずに泚目したす。 これらは厳密な遞択基準ではなく、単なる掚奚事項です-æ•°å­Šã‚„Pythonを知らなくおもコヌスに登録でき、同時に構成できたす









たた、コヌスに぀いおはこの発衚に蚘茉されおいたす。







どの゜フトりェアが必芁ですか



コヌスを完了するには、倚くのPythonパッケヌゞが必芁です。それらのほずんどは、Python 3.6を䜿甚したAnacondaビルドに含たれおいたす。 埌で、他のラむブラリが必芁になりたす。これに぀いおは埌で説明したす。 完党なリストはDockerfileにありたす。







たた、必芁な゜フトりェアがすべおむンストヌルされおいるDockerコンテナを䜿甚するこずもできたす。 詳现は、 リポゞトリの Wiki ペヌゞにありたす 。







コヌスぞの接続方法



正匏な登録は必芁ありたせん。開始18幎1月1日埌であればい぀でもコヌスに接続できたすが、宿題の締め切りは倧倉です。

しかし、あなたに぀いおもっず知るために









2.コヌスの宿題





3.パンダの基本的な方法のデモンストレヌション



すべおのコヌドは、 この Jupyterノヌトブックで再珟できたす。







Pandasは、広範なデヌタ分析機胜を提䟛するPythonラむブラリです。 デヌタセンティストが䜿甚するデヌタは、倚くの堎合、ラベルの圢匏で保存されたす。たずえば、.csv、.tsv、たたは.xlsx圢匏です。 Pandasラむブラリを䜿甚するず、このような衚圢匏のデヌタは、SQLに䌌たク゚リを䜿甚しお読み蟌み、凊理、分析するのに非垞に䟿利です。 たた、ラむブラリMatplotlibおよびSeaborn Pandasず組み合わせお、衚圢匏デヌタの芖芚的分析のための十分な機䌚を提䟛したす。







Pandasの䞻なデヌタ構造は、 Series クラスずDataFrameクラスです。 これらの最初のものは、固定タむプの1次元のむンデックス付きデヌタ配列です。 2番目は、2次元のデヌタ構造です。これは、各列に同じタむプのデヌタが含たれるテヌブルです。 Seriesオブゞェクトの蟞曞ず考えるこずができたす。 DataFrame構造は、実際のデヌタの衚瀺に最適です。行は個々のオブゞェクトの機胜の説明に察応し、列は機胜に察応したす。







#  Pandas  Numpy import pandas as pd import numpy as np
      
      





ビゞネスの䞻な方法を瀺し、通信事業者の顧客の流出に関するデヌタセットを分析したす ダりンロヌドする必芁はありたせん。リポゞトリにありたす。 デヌタを読み取り read_csv



メ゜ッド、 head



メ゜ッドを䜿甚しお最初の5行を確認したす。







 df = pd.read_csv('../../data/telecom_churn.csv')
      
      





 df.head()
      
      









Jupyterノヌトブックのデヌタフレヌムの出力に぀いお

Jupyterノヌトブックでは、Pandasデヌタフレヌムはこのような矎しいプレヌトの圢で衚瀺され、 print(df.head())



が悪化したす。

デフォルトでは、Pandasは20列ず60行のみを衚瀺するため、デヌタフレヌムが倧きい堎合は、 set_option



関数を䜿甚したす。







 pd.set_option('display.max_columns', 100) pd.set_option('display.max_rows', 100)
      
      





各行は1぀のクラむアントを衚したす-これは調査の察象です 。

列はオブゞェクトの機胜です 。







暙識の説明
圹職 説明 皮類
郜道府県 州の手玙コヌド 定栌
アカりントの長さ 䌚瀟が顧客にサヌビスを提䟛しおいる期間 定量的
垂倖局番 電話番号のプレフィックス 定量的
囜際蚈画 囜際ロヌミング接続枈み/未接続 バむナリ
ボむスメヌルプラン ボむスメヌル接続枈み/未接続 バむナリ
vmailメッセヌゞの数 音声メッセヌゞの数 定量的
総日分 日䞭の䌚話の合蚈時間 定量的
合蚈日通話 日䞭の合蚈通話数 定量的
合蚈日料金 日䞭のサヌビスの支払い総額 定量的
合蚈前倜 倕方の合蚈䌚話時間 定量的
総通話数 合蚈倜の呌び出し 定量的
前倜料金 倕方のサヌビスの支払い総額 定量的
総倜数 倜の䌚話の合蚈時間 定量的
合蚈倜間通話 倜の合蚈通話数 定量的
合蚈宿泊料金 合蚈倜間サヌビス料 定量的
合蚈囜際分 囜際通話の合蚈時間 定量的
合蚈囜際電話 合蚈囜際電話 定量的
合蚈料金 囜際通話料金の合蚈 定量的
カスタマヌサヌビスコヌル サヌビスセンタヌぞの呌び出し回数 定量的


察象倉数 チャヌン - 流出笊号、バむナリ笊号1-クラむアント損倱、぀たり流出。 次に、この機胜を残りから予枬するモデルを構築したす。これがタヌゲットず呌ばれる理由です。







デヌタのサむズ、特性の名前、およびそれらのタむプを芋おみたしょう。







 print(df.shape)
      
      





 (3333, 20)
      
      





テヌブルには3333行ず20列がありたす。 列名を衚瀺したす。







 print(df.columns)
      
      





 Index(['State', 'Account length', 'Area code', 'International plan', 'Voice mail plan', 'Number vmail messages', 'Total day minutes', 'Total day calls', 'Total day charge', 'Total eve minutes', 'Total eve calls', 'Total eve charge', 'Total night minutes', 'Total night calls', 'Total night charge', 'Total intl minutes', 'Total intl calls', 'Total intl charge', 'Customer service calls', 'Churn'], dtype='object')
      
      





デヌタフレヌムずすべおの蚘号に関する䞀般情報を衚瀺するには、 info



メ゜ッドを䜿甚したす。







 print(df.info())
      
      





 <class 'pandas.core.frame.DataFrame'> RangeIndex: 3333 entries, 0 to 3332 Data columns (total 20 columns): State 3333 non-null object Account length 3333 non-null int64 Area code 3333 non-null int64 International plan 3333 non-null object Voice mail plan 3333 non-null object Number vmail messages 3333 non-null int64 Total day minutes 3333 non-null float64 Total day calls 3333 non-null int64 Total day charge 3333 non-null float64 Total eve minutes 3333 non-null float64 Total eve calls 3333 non-null int64 Total eve charge 3333 non-null float64 Total night minutes 3333 non-null float64 Total night calls 3333 non-null int64 Total night charge 3333 non-null float64 Total intl minutes 3333 non-null float64 Total intl calls 3333 non-null int64 Total intl charge 3333 non-null float64 Customer service calls 3333 non-null int64 Churn 3333 non-null bool dtypes: bool(1), float64(8), int64(8), object(3) memory usage: 498.1+ KB None
      
      





bool



、 int64



、 float64



およびobject



は属性のタむプです。 1぀の属性が論理ブヌル、3぀の属性がオブゞェクト型、16の属性が数倀であるこずがわかりたす。 たた、 info



メ゜ッドを䜿甚しおデヌタのギャップをすばやく確認するず䟿利です。この䟋では、各列に3333の芳枬倀がありたす。







astype



メ゜ッドを䜿甚しお、列タむプを倉曎できたす 。 このメ゜ッドをChurn



適甚し、 int64



倉換しint64











 df['Churn'] = df['Churn'].astype('int64')
      
      





describe



メ゜ッドは、各数倀特性タむプint64



およびfloat64



のデヌタの䞻芁な統蚈特性を瀺したす。欠損倀の数、平均、暙準偏差、範囲、䞭倮倀、0.25および0.75四分䜍数。







 df.describe()
      
      









非数倀蚘号の統蚈を調べるには、察象のタむプを明瀺的にinclude



パラメヌタヌに指定する必芁がありたす。







 df.describe(include=['object', 'bool'])
      
      





郜道府県 囜際蚈画 ボむスメヌルプラン
数える 3333 3333 3333
ナニヌクな 51 2 2
トップ Wv いや いや
頻床 106 3010 2411




カテゎリ型 object



型およびブヌル型ブヌル型の蚘号には、 value_counts



メ゜ッドを䜿甚できたす。 タヌゲット倉数Churn



によるデヌタの分垃を芋おみたしょう。







 df['Churn'].value_counts()
      
      





 0 2850 1 483 Name: Churn, dtype: int64
      
      





3333人のナヌザヌのうち2850人が忠実で、 Churn



倉数の倀は0



です。







倉数Area code



によるナヌザヌの分垃を芋おみたしょう。 パラメヌタヌの倀normalize=True



を指定しお、絶察呚波数ではなく盞察呚波数を衚瀺したす。







 df['Area code'].value_counts(normalize=True)
      
      





 415 0.496550 510 0.252025 408 0.251425 Name: Area code, dtype: float64
      
      





仕分け



DataFrameは、任意の笊号の倀で゜ヌトできたす。 この䟋では、たずえば、 Total day charge



 ascending=False



で䞊べ替える堎合はascending=False



によっお







 df.sort_values(by='Total day charge', ascending=False).head()
      
      









列グルヌプで゜ヌトできたす







 df.sort_values(by=['Churn', 'Total day charge'], ascending=[True, False]).head()
      
      





時代遅れの゜ヌト makkos に関するコメントを ありがずう











デヌタのむンデックス䜜成ず取埗



DataFrameは、さたざたな方法でむンデックスを䜜成できたす。 この点に関しお、簡単な質問を䟋ずしお䜿甚しお、デヌタフレヌムから必芁なデヌタをむンデックス付けおよび抜出するさたざたな方法を怜蚎したす。







単䞀の列を取埗するには、 DataFrame['Name']



ずいう圢匏の構成を䜿甚できたす。 これを䜿甚しお、デヌタフレヌム内の䞍誠実なナヌザヌの割合はどれくらいかずいう質問に答えたす。







 df['Churn'].mean(). # : 0.14491449144914492
      
      





14.5は䌁業にずっおかなり悪い指暙であり、そのような割合の流出を砎るこずができたす。







非垞に䟿利なのは、単䞀の列でDataFrameの論理むンデックスを䜜成するこずです 。 df[P(df['Name'])]



になりたす。ここで、 P



はName



列の各芁玠に察しおチェックされる論理条件です。 このむンデックスの結果は、 Name



列の条件P



を満たす行のみで構成されるDataFrameです。







これを䜿甚しお、 䞍誠実なナヌザヌの数倀蚘号の平均倀はいくらですかずいう質問に答えたす。







 df[df['Churn'] == 1].mean()
      
      





 Account length 102.664596 Number vmail messages 5.115942 Total day minutes 206.914079 Total day calls 101.335404 Total day charge 35.175921 Total eve minutes 212.410145 Total eve calls 100.561077 Total eve charge 18.054969 Total night minutes 205.231677 Total night calls 100.399586 Total night charge 9.235528 Total intl minutes 10.700000 Total intl calls 4.163561 Total intl charge 2.889545 Customer service calls 2.229814 Churn 1.000000 dtype: float64
      
      





前の2皮類のむンデックス䜜成を組み合わせお、質問に答えたす。䞍誠実なナヌザヌは、日䞭平均しおどれくらい電話で話したすか







 df[df['Churn'] == 1]['Total day minutes'].mean() # : 206.91407867494823
      
      





囜際ロヌミングサヌビスを䜿甚しない忠実なナヌザヌ Churn == 0



 'International plan' == 'No'



間の囜際通話の最倧長は







 df[(df['Churn'] == 0) & (df['International plan'] == 'No')]['Total intl minutes'].max() # : 18.899999999999999
      
      





デヌタフレヌムには、列たたは行の名前、たたはシリアル番号でむンデックスを付けるこずができたす。 名前による玢匕付けには、 番号 iloc



による loc



メ゜ッドが䜿甚されたす。







最初のケヌスでは、 「0から5の行のidおよび州から垂倖局番の列 の倀を枡したす」 、2番目の堎合、 「最初の3列の最初の5行の倀を枡したす」ず蚀いたす 。







ホステスぞの泚意スラむスオブゞェクトをilocに枡すず、デヌタフレヌムは通垞どおり切れたす。 ただし、 locの堎合、スラむスの開始ず終了の䞡方が考慮されたす ドキュメントぞのリンク 、コメントをありがずうarkane0906 。


 df.loc[0:5, 'State':'Area code']
      
      





郜道府県 アカりントの長さ 垂倖局番
0 Ks 128 415
1 ああ 107 415
2 ニュヌゞャヌゞヌ 137 415
3 ああ 84 408
4 わかった 75 415
5 AL 118 510




 df.iloc[0:5, 0:3]
      
      





郜道府県 アカりントの長さ 垂倖局番
0 Ks 128 415
1 ああ 107 415
2 ニュヌゞャヌゞヌ 137 415
3 ああ 84 408
4 わかった 75 415




デヌタフレヌムの最初たたは最埌の行が必芁な堎合は、 df[:1]



たたはdf[-1:]



構造を䜿甚したす。







 df[-1:]
      
      









セル、列、および行ぞの関数の適甚



各列ぞの関数の適甚適甚







 df.apply(np.max)
      
      





 State WY Account length 243 Area code 510 International plan Yes Voice mail plan Yes Number vmail messages 51 Total day minutes 350.8 Total day calls 165 Total day charge 59.64 Total eve minutes 363.7 Total eve calls 170 Total eve charge 30.91 Total night minutes 395 Total night calls 175 Total night charge 17.77 Total intl minutes 20 Total intl calls 20 Total intl charge 5.4 Customer service calls 9 Churn True dtype: object
      
      





apply



メ゜ッドを䜿甚しお、各行に関数をapply



するこずもできたす。 これを行うには、 axis=1



指定したす。







列内の各セルに関数を適甚する map









たずえば、 map



メ゜ッドを䜿甚しお、 {old_value: new_value}



圢匏の蟞曞を匕数ずしお枡すこずにより、列の倀を眮換でき{old_value: new_value}



。







 d = {'No' : False, 'Yes' : True} df['International plan'] = df['International plan'].map(d) df.head()
      
      









replace



メ゜ッドを䜿甚しお、同様の操䜜を実行できたす。







 df = df.replace({'Voice mail plan': d}) df.head()
      
      









デヌタのグルヌプ化



䞀般に、Pandasのデヌタグルヌプは次のずおりです。







 df.groupby(by=grouping_columns)[columns_to_show].function()
      
      





  1. groupbyメ゜ッドはgroupby



    適甚され、デヌタをgrouping_columns



    特性たたは特性セットで分離したす。
  2. 必芁な列を遞択したす columns_to_show



    。
  3. 1぀たたは耇数の機胜が、受信したグルヌプに適甚されたす。


Churn



属性の倀に応じおデヌタをグルヌプ化し、各グルヌプの3぀の列の統蚈を衚瀺したす。







 columns_to_show = ['Total day minutes', 'Total eve minutes', 'Total night minutes'] df.groupby(['Churn'])[columns_to_show].describe(percentiles=[])
      
      













同じこずをしたしょう。ただし、わずかに異なる方法で、関数のリストをagg



枡したす。







 columns_to_show = ['Total day minutes', 'Total eve minutes', 'Total night minutes'] df.groupby(['Churn'])[columns_to_show].agg([np.mean, np.std, np.min, np.max])
      
      









芁玄衚



サンプルの芳枬倀が、 Churn



ずInternational plan



2぀の機胜のコンテキストでどのように分垃しおいるかを確認するずしたす。 これを行うために、 crosstab



メ゜ッドを䜿甚しお分割衚を䜜成できたす 。







 pd.crosstab(df['Churn'], df['International plan'])
      
      





囜際蚈画 いや はい
チャヌン
0 2664 186
1 346 137




 pd.crosstab(df['Churn'], df['Voice mail plan'], normalize=True)
      
      





ボむスメヌルプラン いや はい
チャヌン
0 0.602460 0.252625
1 0.120912 0.024002




ほずんどのナヌザヌは忠実であり、同時に远加のサヌビス囜際ロヌミング/ボむスメヌルを䜿甚しおいるこずがわかりたす。







Excelの䞊玚ナヌザヌは、おそらくピボットテヌブルなどの機胜を思い出すでしょう。 Pandasでは、 pivot_table



メ゜ッドはピボットテヌブルを担圓し、パラメヌタヌずしお受け取りたす。









異なる垂倖局番の日䞭、倜間、倜間の平均通話数を芋おみたしょう。







 df.pivot_table(['Total day calls', 'Total eve calls', 'Total night calls'], ['Area code'], aggfunc='mean').head(10)
      
      





合蚈日通話 総通話数 合蚈倜間通話
垂倖局番
408 100.496420 99.788783 99.039379
415 100.576435 100.503927 100.398187
510 100.097619 99.671429 100.601190




デヌタフレヌムの倉換



Pandasのその他の機胜ず同様に、DataFrameに列を远加するにはいく぀かの方法がありたす。







たずえば、すべおのナヌザヌの合蚈通話数を蚈算したす。 Series型のオブゞェクトtotal_calls



䜜成し、デヌタフレヌムに挿入したす。







 total_calls = df['Total day calls'] + df['Total eve calls'] + \ df['Total night calls'] + df['Total intl calls'] df.insert(loc=len(df.columns), column='Total calls', value=total_calls) # loc -  ,      Series #   len(df.columns),       df.head()
      
      









䞭間シリヌズを䜜成せずに、既存の列から列を远加できたす。







 df['Total charge'] = df['Total day charge'] + df['Total eve charge'] + df['Total night charge'] + df['Total intl charge'] df.head()
      
      









列たたは行を削陀するには、 drop



メ゜ッドを䜿甚しお、匕数ずしお目的のむンデックスずaxis



パラメヌタヌの必芁な倀を枡したす列を削陀する堎合は1



、行を削陀する堎合は0



たたは0











 #       df = df.drop(['Total charge', 'Total calls'], axis=1) df.drop([1, 2]).head() #      
      
      









4.流出を予枬する最初の詊み



流出が「囜際ロヌミングの接続」囜際蚈画ずいう蚘号でどのように接続されおいるかを芋おみたしょう。 これを行うには、 クロスタブピボットプレヌトを䜿甚するずずもに、Seabornで説明したすこのような画像を䜜成し、それらを䜿甚しおグラフィックを分析する方法は、次の蚘事の資料です。







 pd.crosstab(df['Churn'], df['International plan'], margins=True)
      
      





囜際蚈画 停 本圓 党郚
チャヌン
0 2664 186 2850
1 346 137 483
党郚 3010 323 3333








ロヌミングが接続されるず、流出シェアがはるかに高くなるこずがわかりたす-興味深い芳察結果です おそらく、ロヌミングにおける倚額で管理が䞍十分な費甚は、非垞に盞反するものであり、通信事業者の顧客の䞍満を招き、したがっお流出に぀ながりたす。







次に、もう1぀の重芁な兆候である「サヌビスセンタヌぞの呌び出し回数」顧客サヌビス呌び出しを芋おください 。 ピボットテヌブルず画像も䜜成したす。







 pd.crosstab(df['Churn'], df['Customer service calls'], margins=True)
      
      





カスタマヌサヌビスコヌル 0 1 2 3 4 5 6 7 8 9 党郚
チャヌン
0 605 1059 672 385 90 26 8 4 1 0 2850
1 92 122 87 44 76 40 14 5 1 2 483
党郚 697 1181 759 429 166 66 22 9 2 2 3333








ピボットプレヌトではそれほどはっきりず芋えないかもしれたせんたたは数字のある線に沿っお目をクロヌルするのは退屈ですが、写真は、サヌビスセンタヌぞの4回の呌び出しから流出の割合が倧幅に増加するこずを雄匁に瀺しおいたす。







ここで、DataFrameにバむナリ蚘号を远加したす。これは、 Customer service calls > 3



の比范の結果Customer service calls > 3



です。 そしお再び、それがどのように流出に関連付けられおいるかを芋おみたしょう。







 df['Many_service_calls'] = (df['Customer service calls'] > 3).astype('int') pd.crosstab(df['Many_service_calls'], df['Churn'], margins=True)
      
      





チャヌン 0 1 党郚
Many_service_calls
0 2721 345 3066
1 129 138 267
党郚 2850 483 3333








䞊蚘の条件を組み合わせお、この結合ず流出の芁玄プレヌトを䜜成したす。







 pd.crosstab(df['Many_service_calls'] & df['International plan'] , df['Churn'])
      
      





チャヌン 0 1
row_0
停 2841 464
本圓 9 19




これは、サヌビスセンタヌぞのコヌル数が3を超えおおり、ロヌミングが接続されおいる堎合およびロむダルティを予枬する堎合-それ以倖にクラむアントの流出を予枬するこずを意味したす。 この85.8は、非垞に単玔な掚論で埗られたものであり、これから構築する機械孊習モデルのベヌスラむンずしお適しおいたす 。







䞀般に、機械孊習の登堎前は、デヌタ分析プロセスは次のように芋えおいたした。 芁玄するず









5.宿題№1



さらに、コヌスは英語で行われたすメディアに関する蚘事もありたす。 次の打ち䞊げは2018幎10月1日です。







りォヌムアップ/トレヌニングに぀いおは、パンダを䜿甚しお人口統蚈デヌタを分析するこずをお勧めしたす。 Jupyterの空癜に䞍足しおいるコヌドを入力し、 Webフォヌムで正しい回答を遞択する必芁がありたすそこにも解決策がありたす。







6.有甚なリ゜ヌスの抂芁





この蚘事は、 yorko Yuri Kashnitskyず共同執筆したした 。








All Articles