#導入相應的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
#圖可以顯示中文和負號
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=Falsedata = pd.read_excel("D:\data\student-score\student-score.xlsx")
data.head()data = data.drop(columns = ["序號","品德","科學"],axis = 1) #由於品德和科學的總分與其他學科不一致,為了圖片顯示效果,刪除這兩個學科成績data.loc[:,"總分"] = data.loc[:,"語文"] + data.loc[:,"數學"] + data.loc[:,"英語"] #重新計算總分成績
data.head()data.shape #查看數據結構
# 輸出
(629, 6)data.isnull().sum() #查看缺失值情況
'''
姓名 0
學校 0
語文 1
數學 0
英語 0
總分 1
dtype: int64
'''
對於這些缺失值,我們可以選擇使用dropna()函數刪除:data = data.dropna() #刪除缺失值
data.shape # (628, 6)
再使用describe()函數進行簡單的統計描述:散點圖gp = data.groupby(by = "學校",as_index=False) #以學校為分組依據進行分組
data1=gp.mean() #分組後的聚合運算為計算均值
data1.head()# 繪製各學科成績散點圖
plt.figure(figsize=(6,4))
plt.scatter(data1["總分"],data1["語文"],marker='v')
plt.scatter(data1["總分"],data1["數學"],marker='o')
plt.scatter(data1["總分"],data1["英語"],marker='*')
plt.title("各學校成績散點圖",fontsize = 14)
plt.xlabel("總成績")
plt.ylabel("各學科成績")
plt.legend(["語文","數學","英語"]);# 繪製各學科成績散點圖
plt.figure(figsize=(6,4))
plt.scatter(data1["總分"],data1["語文"],marker='v')
plt.title("各學校語文與總分成績散點圖",fontsize = 14)
plt.xlabel("總成績")
plt.ylabel("各學科成績")
plt.legend(["語文"])
# <matplotlib.legend.Legend at 0x1da13d256c8># 繪製各學科成績散點圖
data1.plot.scatter(x = "總分", y = "語文")
plt.title("語文與總分成績散點圖")
data1.plot.scatter(x = "總分", y = "數學")
plt.title("數學與總分成績散點圖")
data1.plot.scatter(x = "總分", y = "英語")
plt.title("英語與總分成績散點圖")
# plt.show()
得到Text(0.5, 1.0, '英語與總分成績散點圖'),且散點圖結果如下:折線圖data1["序號"]=data1.學校.str.extract('(\d+)')
data10 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 1
11 20
12 21
13 2
14 3
15 4
16 5
17 6
18 7
19 8
20 9
Name: 序號, dtype: objectser1 = ser1.astype("int")
ser10 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 1
11 20
12 21
13 2
14 3
15 4
16 5
17 6
18 7
19 8
20 9
Name: 序號, dtype: int32del data1["序號"]
data1.index = ser1
data1data1=data1.sort_index()
data1plt.figure(figsize=(10,4))
plt.plot(range(21),data1.iloc[:,1],'-*') #選取語文成績數據
plt.plot(range(21),data1.iloc[:,2],'-o') #選取數學成績數據
plt.plot(range(21),data1.iloc[:,3],'-v') #選取英語成績數據
plt.title('各學科成績變化走勢圖')
plt.xlabel('各學校')
plt.ylabel('學科成績')
plt.xticks(range(21),data1["學校"],rotation=30) #rotation=30控制文字傾斜角度
plt.legend(['語文','數學','英語']);
直方圖yw = data1.loc[:,"學校":"語文"] #提取數據繪製直方圖,直方圖原理,每個需要被畫圖的標籤對應一個數值
yw = yw.T
ywyw.columns = yw.iloc[0] #將學校欄位轉換成列索引
yw1 = yw.drop("學校",axis=0) #刪多餘的行信息
yw1# 每個學校語文平均成績的直方圖
plt.figure(figsize=(12,4))
plt.bar(range(21),yw.loc["語文",:],width=0.5)
plt.title("語文成績直方圖",fontsize = 14)
plt.ylabel("語文成績",fontsize = 14)
plt.xticks(range(21),yw.iloc[0],rotation=30,fontsize = 12); #x軸刻度為各學校名稱sx = data1.loc[:,["學校","數學"]]
sx = sx.T
sxsx.columns = sx.iloc[0]
sx = sx.drop("學校",axis=0)
sx# 每個學校數學平均成績的直方圖
plt.figure(figsize=(12,4))
plt.bar(range(21),sx.loc["數學",:],width=0.5)
plt.title("數學成績直方圖",fontsize = 14)
plt.ylabel("數學成績",fontsize = 14)
plt.xticks(range(21),yw.iloc[0],rotation=30,fontsize = 12); #x軸刻度為各學校名稱data2 = data1.drop("總分",axis = 1) #新建一個dataframe,刪掉總分列,因為總分和單科成績相差太多,影響繪圖效果
data2.head()# 將多個學科成績畫到一張圖中 #截取前十
data2.plot.bar(x = '學校',y = ['語文','數學','英語'],figsize=(16,6),width=0.7,rot = 30,title = "各學科成績直方圖"); #rot空值標籤傾斜程度
餅圖plt.figure(figsize=(4,4),dpi=80)
plt.pie(data2.iloc[0,1:] #選取數據源
,labels=['語文','數學','英語']
,autopct='%1.2f') #設置百分比經度
# ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區之間的間隙
# ,colors=['r','g','b']) #設置餅圖各個扇區的顏色
plt.title('第1小學各學科成績佔比',fontsize=12);
#fontsize設定字體的大小,xlabel,ylabel,title裡面都可以設定pic2 = plt.figure(figsize=(8,8),dpi=80)
fig1 = pic2.add_subplot(2,2,1) #第一個子圖
plt.pie(data2.iloc[0,1:] #選取數據源 第10小學各學科成績
,labels=['語文','數學','英語']
,autopct='%1.2f') #設置百分比經度
# ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區之間的間隙
# ,colors=['r','g','b']) #設置餅圖各個扇區的顏色
plt.title('第1小學各學科成績佔比',fontsize=12)
fig2 = pic2.add_subplot(2,2,2) #第二個字圖
plt.pie(data2.iloc[1,1:] #選取數據源,第11小學各學科成績
,labels=['語文','數學','英語']
,autopct='%1.2f') #設置百分比經度
# ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區之間的間隙
# ,colors=['r','g','b']) #設置餅圖各個扇區的顏色
plt.title('第2小學各學科成績佔比',fontsize=12)
fig3 = pic2.add_subplot(2,2,3) #第二個字圖
plt.pie(data2.iloc[2,1:] #選取數據源,第12小學各學科成績
,labels=['語文','數學','英語']
,autopct='%1.2f') #設置百分比經度
# ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區之間的間隙
# ,colors=['r','g','b']) #設置餅圖各個扇區的顏色
plt.title('第3小學各學科成績佔比',fontsize=12)
fig4 = pic2.add_subplot(2,2,4) #第二個字圖
plt.pie(data2.iloc[3,1:] #選取數據源,第13小學各學科成績
,labels=['語文','數學','英語']
,autopct='%1.2f') #設置百分比經度
# ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區之間的間隙
# ,colors=['r','g','b']) #設置餅圖各個扇區的顏色
plt.title('第4小學各學科成績佔比',fontsize=12);
箱型圖data_1 = data.loc[data['學校'] =="第1小學"] #提取第一小學的所有信息
score = (list(data_1.iloc[:,2]),list(data_1.iloc[:,3]),list(data_1.iloc[:,4]))
plt.figure(figsize=(8,6))
plt.boxplot(score
,labels=['語文','數學','英語']
,notch=True #缺口中位數位置
,sym='*'#設定異常值的形狀
,whis=1.5); #設定幾倍標準差之外的數據算是異常值,默認是1.5
鐵達尼號數據text = pd.read_csv(r'result.csv')
text.head()
男女中生存人數分布情況sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar(color='chocolate')
plt.title('survived_count')
plt.show()
男女中生存人與死亡人數的比例text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')
# Text(0, 0.5, 'count')
不同票價的人生存和死亡人數分布情況# 排序後繪折線圖
fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()
不同的票價所反映出來的生存人數是非常明顯的,票價低的人死亡數量高是因為離甲板遠,且逃生機會大大降低。# 排序前繪折線圖
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
fig = plt.figure(figsize=(20, 18))
fare_sur1.plot(grid=True)
plt.legend()
plt.show()
不同倉位等級的人生存和死亡人員的分布情況# 1表示生存,0表示死亡
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=text)
# <matplotlib.axes._subplots.AxesSubplot at 0x1da160cdc08>facet = sns.FacetGrid(text, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()
# <seaborn.axisgrid.FacetGrid at 0x1da16136588>text.Age[text.Pclass == 1].plot(kind='kde')
text.Age[text.Pclass == 2].plot(kind='kde')
text.Age[text.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")
# <matplotlib.legend.Legend at 0x1da161b27c8>Jupyter 平臺最強插件,沒有之一!
本地 IDE 已廢!GitHub 的雲 VSCode 實測
太可怕了!這個 Jupyter 插件可能會讓我失業!
牛逼!一行代碼讓pandas的apply速度飆到極致!
臥槽!一個比 pandas 快百倍的大數據分析神器!
用這個網站一查,才知道自己被賣了
再見,可視化!你好,Pandas!
特別推薦:一個優質的推薦Github開源項目的公眾號「GitHuboy」,每天給大家分享前沿、優質的項目,涉及 Java、Python、Go、Web前端、AI、數據分析等多個領域,非常值得大家關注。
回復「Java學習」獲得 1024G Java學習資料
回復「Python學習」獲得 100G Python學習資料