オヌプン機械孊習コヌス。 トピック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']) 

郜道府県囜際蚈画ボむスメヌルプラン
数える333333333333
ナニヌクな5122
トップWvいやいや
頻床10630102411


カテゎリ型 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'] 

郜道府県アカりントの長さ垂倖局番
0Ks128415
1ああ107415
2ニュヌゞャヌゞヌ137415
3ああ84408
4わかった75415
5AL118510


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

郜道府県アカりントの長さ垂倖局番
0Ks128415
1ああ107415
2ニュヌゞャヌゞヌ137415
3ああ84408
4わかった75415


デヌタフレヌムの最初たたは最埌の行が必芁な堎合は、 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']) 

囜際蚈画いやはい
チャヌン
02664186
1346137


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

ボむスメヌルプランいやはい
チャヌン
00.6024600.252625
10.1209120.024002


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


Excelの䞊玚ナヌザヌは、おそらくピボットテヌブルなどの機胜を思い出すでしょう。 Pandasでは、 pivot_tableメ゜ッドはピボットテヌブルを担圓し、パラメヌタヌずしお受け取りたす。



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


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

合蚈日通話総通話数合蚈倜間通話
垂倖局番
408100.49642099.78878399.039379
415100.576435100.503927100.398187
510100.09761999.671429100.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) 

囜際蚈画停本圓党郚
チャヌン
026641862850
1346137483
党郚30103233333




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


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


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

カスタマヌサヌビスコヌル0123456789党郚
チャヌン
06051059672385902684102850
1921228744764014512483
党郚697118175942916666229223333




ピボットプレヌトではそれほどはっきりず芋えないかもしれたせんたたは数字のある線に沿っお目をクロヌルするのは退屈ですが、写真は、サヌビスセンタヌぞの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) 

チャヌン01党郚
Many_service_calls
027213453066
1129138267
党郚28504833333




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


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

チャヌン01
row_0
停2841464
本圓919


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


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



5.宿題№1


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


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


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



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

Source: https://habr.com/ru/post/J322626/


All Articles