對FIFA2018球員做數據分析
整體思路:
1、確定分析目標
2、導入數據文件
3、查看數據
4、確定分析維度和指標
5、清理需要的數據
6、利用數據做分析
7、根據需要做圖
首先要對FIFA_2018中球員信息做個總體瞭解
1. 導入所需要的庫/包:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2. 加載數據文件(FIFA_2018_player.csv)
df = pd.read_csv('./FIFA_2018_player.csv')
3. 簡單查看數據,有哪些列,都是什麼類型的值
df.head()
有哪些列:
name:球員姓名
full_name:球員姓名全稱
nationality:國家
league:聯賽
club:俱樂部
age:年齡
birth_date:出生日期
height_cm:身高
weight_kg:體重
eur_value:身價
eur_wage:工資
4. 看下數據的整體信息 (包括count、mean、min、max等)
df.describe()
在數據的整體信息中,也可以看出哪些數據是不太正常的。
像身價eur_value最小值爲0,可以後續查看是否異常。
年齡age最小值是16歲,也可以查看是否正常等。
5. 開始數據清理
所有需要分析的數據都需要查看,是否有缺失或者不正常的數據。
對於數值型,可以看下describe⽅法輸出的信息,重點關注最⼤值、最⼩值、平均值、⾏數等數據。
6.查看name是否有null值
df[df.name.isnull()]
#df.name.isnull()
isnull返回的是布爾類型的值,如果沒有null值返回的就是False
name沒有null值
7.full_name是否有null值
df[df.full_name.isnull()]
8.nationality是否有null值
df[df.nationality.isnull()]
9. league是否有null值
df[df.league.isnull()]
10.可以通過count查看總數(非null數量)以及查看對應列有沒有null值。
df.count()
總數是17994條,可以看到 league和club 中有null值。
11.查看league和club的null值
df[df.league.isnull()]
可以看到league列中有253條null值。
此時我們可以對存在的null值做處理。
①如果不需要聯賽league或者俱樂部club的信息那麼我們可以刪掉,因爲null值的數量也不是很多;
②如果我們做分析時需要用到league或者club的值,在數據量小的情況下可以在瞭解真實數據後進行重新賦值。
253條數據對於⼀萬多條數據來說影響還好,可以刪掉,那麼我們要把league和club中的null值刪掉。
12.刪除league聯賽缺失的數據
df.drop(df[df.league.isnull()].index,inplace=True)
查看是否刪除成功:df[df.league.isnull()]
club俱樂部的缺失值也可以刪除,方法和刪除聯賽league一樣。
刪除:df.drop(df[df.club.isnull()].index,inplace=True)
查看:df[df.club.isnull()]
13.根據4.查看數據的描述性信息describe可知,如果覺得age列最⼩值有問題,可以輸出查看下,其他的類似
df[df['age'] == 16]
可以看出age年齡最小的16的數據沒有問題。
14.身價eur_value列最⼩值是0,也需要看一下
df[df['eur_value'] < 1000]
#df[df['eur_value'] == 0]
eur_value爲0的列可以使⽤平均值填充(只有⼏條數據,也可以刪除)
df['eur_value'].replace(0,df['eur_value'].mean(),inplace=True)
填充完查看是否填充成功
df[df['eur_value']<1000]
# df.loc[7734] #通過索引查看
# df[df.ID==148745] #通過ID查看
填充成功,eur_value爲0的數據已經沒有了。
eur_wage列最⼩值是0,也需要看下
df[df['eur_wage'] < 1000]
或
df[df['eur_wage'] == 0]
查看,處理方法類似。
15.最後看下有⽆重複值(如果有可以⽤drop_duplicates處理)
df[df.duplicated()]
16.對指定的列判斷是否有重複值
df[df.loc[:,['full_name', 'nationality', 'league', 'club','birth_date']].duplicated()]
17.我們還可以查看下name姓名、全稱full_name以及出生日期等有沒有重複的值,對應數據查看有沒有一樣的數據,如果有的話可以進行刪除操作。
df[df.full_name.duplicated()]
可以看到有102條全稱的名字有重複值
我們可以隨便找一條重複記錄看一下:
df[df['full_name'] == 'Carlos Sánchez']
可以看到雖然全稱名字一樣,但是國家、俱樂部,出生日期等都不一樣,所以就是簡單的重名而已。
數據清洗完畢,可以開始分析
1.查看樣本總數
df.count()
2.數值類型列的⼀些常⻅的統計學指標
df.describe()
分析最主要的就是確定維度和指標
什麼是維度和指標呢?
維度指的就是一列或者多列,指標就是統計值或者數據
3.統計不同國家的人數
nationality_data = df.groupby('nationality', as_index=False).count()[['nationality', 'ID']]
nationality_data
我們不需要將國家作爲索引,所以要加 as_index=False
這樣也不利於查看,我們一般將統計後的數據要進行排序,方便我們查看,升序或者降序排列要根據需求定。(查看下面的4.小題)
現在顯示的是ID,我們其實求出來的是人員數量,我們需要給其重命名一下:
nationality_data.rename(columns={'ID':'player_count'}, inplace=True)
nationality_data
4.按照運動員數量排名,sort_values排序
nationality_sorted_data = nationality_data.sort_values('player_count',ascending=False)
nationality_sorted_data
ascending=False 從大到小排序
5.運動員數量⼤於100的國家列表
nationality_sorted_data[nationality_sorted_data.player_count > 100]
6.各⼤聯賽得運動員數量
要根據聯賽league分組
league_data = df.groupby('league', as_index=False).count()[['league','ID']].sort_values('ID', ascending=False)
league_data.rename(columns={'ID':'people_count'},inplace=True)
league_data
分組groupby,排序sort_values,重命名rename
7.計算各俱樂部平均週薪(工資)
根據club分組,計算工資的平均值
df.groupby('club', as_index=False).mean()[['club','eur_wage']].sort_values('eur_wage', ascending=False).head(10)
#head(10)查看前10行
8.計算英超聯賽English Premier League各個俱樂部球員的平均⽉薪
df[df.league == 'English Premier League'].groupby('club',as_index=False).mean()[['club', 'eur_wage']].sort_values('eur_wage',
ascending=False)
9.計算球員年齡段分佈
我們要使用numpy的arange進行分段
使用cut進行區間劃分,相關於分組,在arange的基礎上
bins = np.arange(15, 50, 5)
bins_data = pd.cut(df['age'], bins)
bin_counts = df['age'].groupby(bins_data).count()
bin_counts
以年齡爲維度,最小值15,最大值50,每5個劃分一個區間
可以看出15-20歲的球員有3300個
簡單的繪圖
折線圖:
bin_counts.plot
爲了圖標展示好看處理index
條形圖:
bin_counts.index = [str(x.left) + '~' + str(x.right) for x in bin_counts.index]
bin_counts.plot(kind='bar', alpha=1, rot=0)
餅圖:
bin_counts.plot(kind='pie')
plt.show()