seaborn和pandas-missingno 的資料視覺化--使用畫圖--缺失值分析

weixin_42053726發表於2019-01-01

目錄

0、seaborn包基本使用

1 pandas列印報表(推薦使用)

2 缺失值分析--Missingno

1,對於每一列資料進行分析缺失值

矩陣圖

柱狀圖

熱力圖

3.畫分佈圖--比如正太分佈圖seaborn

4、資料視覺化--

1,熱度圖seaborn--滿足條件的資料的個數如年齡段為2的女生有多少人

2、柱狀圖(檢視其中一個特徵的每一個種類有多少--比如男性有多少,女性有多少)

seaborn

pandas

5、多變數之間的關係(連續變數)推薦散點圖

pandas

seaborn  三個變數(兩個連續畫點,一個離散分類)

兩個變數(點數少)

6、迴歸畫圖:(畫散點圖和擬合直線圖)連續值

推薦:lmplot 畫散點圖和擬合直線圖

三個變數(畫兩條線,(兩個連續畫點,一個離散分類))

四個變數(多個圖顯示)

7、多變數之間的關係(一個連續一個離散變數)推薦散點蜂圖

三個變數(用顏色區分,兩個離散,一個連續)

8、盒圖,小提琴圖

小提琴圖

9、顯示值的集中趨勢可以用條形圖

10、 點圖可以更好的描述變化差異

11多重皮膚:(整合前面的)

12、FacetGrid(乾的事情和前面一樣,新的方式吧,這個好像很牛逼)

13、熱力圖(一共三列資料)做成表格


 

視覺化使用的資料格式均使用dateframe格式

0、seaborn包基本使用

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

def sinplot(flip=1):
    x = np.linspace(0, 14, 100)
    for i in range(1, 7):
        plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

畫圖之前先設定畫圖的風格:'''5種主題風格darkgrid whitegrid dark white ticks'''下面語句只能選擇一個風格
	sns.set_style("whitegrid")  #更喜歡這種風格  ,使用sns設定plot畫圖的風格,但是並沒有畫圖。
	# sns.set() # 設定預設值風格
	# sns.set_context("poster")  # "paper" "talk" "poster" "notebook"  這個指定線條粗細的越來越粗
	sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5}) #font_scale座標軸數字大小 rc:線條大小
	sns.despine() #設定
	plt.figure(figsize=(8, 6)) #設定影像長寬大小,長8,寬6

畫圖:
	sinplot()
	sns.boxplot(data=data)
	
畫完圖設定邊界線(去掉上、下左右、邊界線):
	sns.despine() # 預設去掉右邊和上邊的邊界線,sns.despine(left=True)這樣寫是去掉左邊的邊界線

顯示影像:
	plt.show()

對於子圖中不同的影像設定不同的風格:用with ,with相當一個域,類似於函式域
	with sns.axes_style("darkgrid"):
		plt.subplot(211)
		sinplot()
	plt.subplot(212)
	sinplot(-1)

關於顏色的選取:離散的顏色,
	current_palette = sns.color_palette() # 預設顏色,
	sns.palplot(sns.color_palette("hls", 8)) #'hls'是一個系統的顏色空間返回8種不同的顏色
	sns.palplot(sns.hls_palette(8, l=.7, s=.9))  # hls_palette()函式來控制顏色的亮度和飽和 l-亮度 lightness ,s-飽和 saturation
	sns.palplot(current_palette) # palplot用來畫圖的,引數是顏色
	sns.palplot(sns.color_palette("Paired",8)) # 8種顏色,兩個兩個是一對,深藍和淺藍 ...
	# 使用xkcd顏色來命名顏色 xkcd包含了一套眾包努力的針對隨機RGB色的命名。產生了954個可以隨時通過xdcd_rgb字典中呼叫的命名顏色。
	plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
	plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
	plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)

關於顏色的選取:連續漸變的顏色
	sns.palplot(sns.color_palette("Blues")) # 正常是離散的傳入引數就變成連續的了 由淺到深
	sns.palplot(sns.color_palette("BuGn_r")) # 由深到淺,如果想要翻轉漸變,可以在皮膚名稱中新增一個_r字尾
	sns.palplot(sns.light_palette("green")) #由淺到深
	sns.palplot(sns.dark_palette("purple")) # 由深到淺,
	sns.palplot(sns.light_palette("navy", reverse=True)) # 由深到淺,
	
	sns.palplot(sns.color_palette("cubehelix", 8))
	
----------------------------------------------------------------------------------
畫圖:單特徵使用直方圖好用,2個特徵使用散點圖好    --特徵就是變數
	x = np.random.normal(size=100)  x是100個隨機數字
	sns.distplot(x,kde=False)  #這個函式是畫直方圖或者柱狀圖,在特定區間中有多少個數字 ,分成預設個區間
	sns.distplot(x, bins=20, kde=False)  #指定分成20個區間
	x = np.random.gamma(6, size=200)
	from scipy import stats, integrate
	sns.distplot(x, kde=False, fit=stats.gamma)  # 用曲線擬合一下,用到了scipiy這個庫 
	
	2變數 舉例  資料量比較小用散點圖
		mean, cov = [0, 1], [(1, .5), (.5, 1)]
		data = np.random.multivariate_normal(mean, cov, 200)
		df = pd.DataFrame(data, columns=["x", "y"])
		sns.jointplot(x="x", y="y", data=df);  #這個是畫出來x和y的三點圖,又畫出來每一個變數的直方圖
		
		資料量比較大,不能用散點圖了,看不了,用半透明的圖,kind="hex"
		x, y = np.random.multivariate_normal(mean, cov, 1000).T
		with sns.axes_style("white"): 設定風格
			sns.jointplot(x=x, y=y, kind="hex", color="k")
			
	3個以上個變數怎麼辦?我要看兩兩變數之間的散點圖,單個變數的直方圖,這個功能包括了上面的sns.jointplot
		iris = sns.load_dataset("iris") #匯入內建資料集,有4列,也就是4個特徵
		print(iris)
		sns.pairplot(iris)
-----------------------------------------------
畫迴歸圖:兩個變數既畫散點圖,又畫迴歸圖,看看是不是線性關係
	例子:regplot 和 lmplot 基本一樣,但是開始推薦使用regplot
	tips = sns.load_dataset("tips")
	sns.regplot(x="total_bill", y="tip", data=tips) #這裡是dateframe格式,也可以是其他的吧,不知道
	sns.lmplot(x="total_bill", y="tip", data=tips);  # 注意這裡兩個變數是連續值,如果是離散值就不能用了,很不好看
	sns.regplot(x="size", y="tip", data=tips, x_jitter=.05) #x_jitter  在x的點加上小範圍的浮動
	
兩個變數有一個是離散值怎麼畫圖:swarmplot 這個好  ,三變數,只不過一個用顏色區分開了
	sns.stripplot(x="day", y="total_bill", data=tips);  #這麼畫太醜了,不好看,都重疊一起了,
	sns.stripplot(x="day", y="total_bill", data=tips, jitter=True) #x軸左右搖擺一下分開,好一些
	sns.swarmplot(x="day", y="total_bill", data=tips)  #這個蜂圖感覺更好
	sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips) #這個更厲害了,將男女都區別開了,用不同的顏色分開
	
盒圖/小提琴圖(用來畫離群點的),小提琴圖更好
IQR即統計學概念四分位距,第一/四分位與第三/四分位之間的距離
N = 1.5IQR 如果一個值>Q3+N或 < Q1-N,則為離群點
	sns.boxplot(x="day", y="total_bill", hue="time", data=tips);#菱形,代表離群點
	sns.violinplot(x="total_bill", y="day", hue="time", data=tips); #中間粗,兩邊細,對稱的
	sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True); # 這個不對稱,被sex這個給分開了
	
不同的圖可以合併,比如蜂圖和小提琴圖
	sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
	sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5)  #alpha透明度

直方圖:條形圖
	sns.barplot(x="sex", y="survived", hue="class", data=titanic); x軸是性別,y軸是獲救率,  將x軸的人按class劃分三個
	
點圖可以更好的描述變化差異:折線圖,點圖,很好用
	sns.pointplot(x="sex", y="survived", hue="class", data=titanic);
	sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
              palette={"male": "g", "female": "m"},
              markers=["^", "o"], linestyles=["-", "--"]);
			  
寬形資料:和盒圖
	sns.boxplot(data=iris,orient="h"); #orient 這裡是橫的畫
	
多層皮膚分類圖:將前面整合在一起了factorplot
	'''
	Parameters:
	x,y,hue 資料集變數 變數名
	date 資料集 資料集名
	row,col 更多分類變數進行平鋪顯示 變數名
	col_wrap 每行的最高平鋪數 整數
	estimator 在每個分類中進行向量到標量的對映 向量
	ci 置信區間 浮點數或None
	n_boot 計算置信區間時使用的引導迭代次數 整數
	units 取樣單元的識別符號,用於執行多級引導和重複測量設計 資料變數或向量資料
	order, hue_order 對應排序列表 字串列表
	row_order, col_order 對應排序列表 字串列表
	kind : 可選:point 預設, bar 柱形圖, count 頻次, box 箱體, violin 提琴, strip 散點,swarm 分散點 size 每個面的高度(英寸) 標量 aspect 縱橫比 標量 orient 方向 "v"/"h" color 顏色 matplotlib顏色 palette 調色盤 seaborn顏色色板或字典 legend hue的資訊皮膚 True/False legend_out 是否擴充套件圖形,並將資訊框繪製在中心右邊 True/False share{x,y} 共享軸線 True/False
	'''
	sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips)
	sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar")
	sns.factorplot(x="day", y="total_bill", hue="smoker",
               col="time", data=tips, kind="swarm")
	sns.factorplot(x="time", y="total_bill", hue="smoker",
               col="day", data=tips, kind="box", size=4, aspect=.5)
			   
			   
非常好用的FacetGrid
	g = sns.FacetGrid(tips, col="time") 先佔好位置,y軸tips ,按照time種類分成幾類,這裡是一個變數
	g.map(plt.hist, "tip");# plt.hist 指定畫這種圖直方圖
	
	g = sns.FacetGrid(tips, col="sex", hue="smoker")
	g.map(plt.scatter, "total_bill", "tip", alpha=.7)
	g.add_legend();
	
	g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)
	g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1);
	
	g = sns.FacetGrid(tips, col="day", size=4, aspect=.5)
	g.map(sns.barplot, "sex", "total_bill");
	
	from pandas import Categorical
	ordered_days = tips.day.value_counts().index
	print (ordered_days)
	ordered_days = Categorical(['Thur', 'Fri', 'Sat', 'Sun'])
	g = sns.FacetGrid(tips, row="day", row_order=ordered_days,
					  size=1.7, aspect=4,)
	g.map(sns.boxplot, "total_bill");
	
	pal = dict(Lunch="seagreen", Dinner="gray")
	g = sns.FacetGrid(tips, hue="time", palette=pal, size=5)
	g.map(plt.scatter, "total_bill", "tip", s=50, alpha=.7, linewidth=.5, edgecolor="white")
	g.add_legend();
	
	g = sns.FacetGrid(tips, hue="sex", palette="Set1", size=5, hue_kws={"marker": ["^", "v"]})
	g.map(plt.scatter, "total_bill", "tip", s=100, linewidth=.5, edgecolor="white")
	g.add_legend();
	
	with sns.axes_style("white"):
		g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, size=2.5)
	g.map(plt.scatter, "total_bill", "tip", color="#334488", edgecolor="white", lw=.5);
	g.set_axis_labels("Total bill (US Dollars)", "Tip");
	g.set(xticks=[10, 30, 50], yticks=[2, 6, 10]);
	g.fig.subplots_adjust(wspace=.02, hspace=.02);
	#g.fig.subplots_adjust(left  = 0.125,right = 0.5,bottom = 0.1,top = 0.9, wspace=.02, hspace=.02)
	
	iris = sns.load_dataset("iris")
	g = sns.PairGrid(iris)
	g.map(plt.scatter);
	
	g = sns.PairGrid(iris)
	g.map_diag(plt.hist)
	g.map_offdiag(plt.scatter);
	
	g = sns.PairGrid(iris, hue="species")
	g.map_diag(plt.hist)
	g.map_offdiag(plt.scatter)
	g.add_legend();
	
	g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"], hue="species")
	g.map(plt.scatter);
	
	g = sns.PairGrid(tips, hue="size", palette="GnBu_d")
	g.map(plt.scatter, s=50, edgecolor="white")
	g.add_legend();
	
------------------------------------
熱度圖:
	flights = sns.load_dataset("flights")
	flights.head() #讀進一個pandas資料,也就是矩陣,好多行,3列(必須是三列,兩列是位置,一列是數值),每個位置有一個點
	flights = flights.pivot("month", "year", "passengers") #轉化為,矩陣形式,
	ax = sns.heatmap(flights)  # 畫圖
	ax = sns.heatmap(flights, annot=True,fmt="d")  #annot每一個位置顯示數值 ,
	ax = sns.heatmap(flights, linewidths=.5)  每個格子之間有縫隙
	ax = sns.heatmap(flights, cmap="YlGnBu") #指定顏色,推薦
	ax = sns.heatmap(flights, cbar=False) # 沒有條,不要用這個

1 pandas列印報表(推薦使用)

報表功能特別強大,幾乎涵蓋了前面的所有

注意報表能在notebook使用

import pandas as pd

datefram=pd.read_csv('bigdata1.csv')

import pandas_profiling

a= pandas_profiling.ProfileReport(datefram)

a

pycharm不能列印出來

2 缺失值分析--Missingno

Missingno:這個包是個畫圖包封裝了matplotlib包一條語句分析缺失值

https://github.com/ResidentMario/missingno

1,對於每一列資料進行分析缺失值

矩陣圖

import pandas as pd
import numpy as np
import missingno as msno
from matplotlib import pyplot as plt
datefram=pd.read_csv('bigdata1.csv')
msno.matrix(datefram.sample(datefram.shape[0]), figsize=(16, 16), width_ratios=(15, 1))
plt.rcParams['font.sans-serif']=['SimHei']   #這兩行用來顯示漢字
plt.rcParams['axes.unicode_minus'] = False
plt.show()

柱狀圖

(將上面的matrix程式碼換成下面這個)

msno.bar(datefram.sample(datefram.shape[0]), figsize=(12, 7), )

熱力圖

msno.heatmap(datefram.sample(datefram.shape[0]),figsize=(12, 7), )

 

3.畫分佈圖--比如正太分佈圖seaborn

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
mu = 0
sigma = 1
sampleNo = 10000
x = np.random.normal(mu, sigma, sampleNo ) #生成10000個數,這10000個數服從標準正太分佈
'''
# 縱座標代表概率密度值,也就是一個數字出現幾次,x:資料;bins:本次幾個區間;fit=stats.gamma:代表要畫出擬合曲線
'''
sns.distplot(x, bins=100, kde=False, fit=stats.gamma) 

plt.show()

4、資料視覺化--

1,熱度圖seaborn--滿足條件的資料的個數如年齡段為2的女生有多少人

構建一個矩陣或者表格形式的資料

# 隨變找兩個離散值的特徵,看看每個對應的種類的個數
temp = pd.crosstab(datefram['性別'], datefram['年齡段'])

這是一個表格
	年齡段  2.0  3.0  4.0  5.0  6.0  7.0  8.0
	性別                                    
	女      7  105  150   91   40   12    3
	男     17  221  331  134   38   15    6

畫圖

sns.heatmap(pd.crosstab(datefram['性別'], datefram['年齡段']), cmap='Blues', annot=True, fmt='d', ax=ax)

2、柱狀圖(檢視其中一個特徵的每一個種類有多少--比如男性有多少,女性有多少)

seaborn

注:年齡段一列必須是數值型的一列,否則報錯
fig, ax = plt.subplots(figsize=(12, 8))
sns.distplot(datefram['年齡段'], kde=False)
fig.tight_layout()

pandas

# 使用pandas進行列印影像
datefram['年齡段'].value_counts(dropna=False, ascending=True).plot(kind='barh', ax=ax)
print(datefram['年齡段'].value_counts())列印出具體值

5、多變數之間的關係(連續變數)推薦散點圖

盒圖,小提琴圖也可以

pandas

from pandas.tools.plotting import scatter_matrix
fig, ax = plt.subplots(figsize=(10, 10))
scatter_matrix(datefram[['年齡段自定義等級', '年齡段', '自定義報價等級']], alpha=0.2, diagonal='hist', ax=ax)
#對角線處為自己和自己,其他地方是每兩個特徵之間的關係

seaborn  三個變數(兩個連續畫點,一個離散分類)

我要看兩兩變數之間的散點圖,

sns.pairplot(iris) # iris為dateframe結構

sns.pairplot(iris) # iris為dateframe結構

兩個變數(點數少)

sns.jointplot(x="x", y="y", data=df);  #這個是畫出來x和y的三點圖,又畫出來每一個變數的直方

點數多:

with sns.axes_style("white"): 設定風格
    sns.jointplot(x=x, y=y, kind="hex", color="k")

6、迴歸畫圖:(畫散點圖和擬合直線圖)連續值

找到上圖的具體的一個線性的  畫圖

fig, ax = plt.subplots(figsize=(10, 7))
sns.regplot('年齡段', '年齡段自定義等級', data=datefram, ax=ax)
ax.set_ylabel("Height [cm]")
ax.set_xlabel("Weight [kg]")
fig.tight_layout()

sns.regplot(x="total_bill", y="tip", data=tips)  #data為dateframe結構   

推薦:lmplot 畫散點圖和擬合直線圖

sns.lmplot(x="total_bill", y="tip", data=tips); 同理 推薦 tips是dateframe格式,x:‘total_bill’是tips的一個列名;y="tip"也是一個列名

三個變數(畫兩條線,(兩個連續畫點,一個離散分類))
 

'''
x,y,hue 都是tips資料dateframe型資料的列名

x和y都必須是數值型的資料,hue一般為離散型非數字型的資料(數值型也可以)
下面例子是smoker有兩種吸菸還是不吸菸,分成不同顏色畫散點圖和擬合直線
'''
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);

四個變數(多個圖顯示)

sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);
#col 離散型的有兩個種類就畫出兩個圖,有三個就畫三個圖

7、多變數之間的關係(一個連續一個離散變數)推薦散點蜂圖

sns.swarmplot(x="day", y="total_bill", data=tips) # tips是dataframe格式

三個變數(用顏色區分,兩個離散,一個連續)

sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips)

8、盒圖,小提琴圖

sns.boxplot(x="day", y="total_bill", hue="time", data=tips);

 

小提琴圖

sns.violinplot(x="total_bill", y="day", hue="time", data=tips);

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);

9、顯示值的集中趨勢可以用條形圖

sns.barplot(x="sex", y="survived", hue="class", data=titanic);

10、 點圖可以更好的描述變化差異

sns.pointplot(x="sex", y="survived", hue="class", data=titanic);

sns.pointplot(x="class", y="survived", hue="sex", data=titanic,

              palette={"male": "g", "female": "m"},

              markers=["^", "o"], linestyles=["-", "--"]);

11多重皮膚:(整合前面的)

sns.factorplot(x="day", y="total_bill", hue="smoker",

               col="time", data=tips, kind="swarm")

12、FacetGrid(乾的事情和前面一樣,新的方式吧,這個好像很牛逼)

g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)

g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1);

g = sns.PairGrid(iris, hue="species")

g.map_diag(plt.hist)

g.map_offdiag(plt.scatter)

g.add_legend();

13、熱力圖(一共三列資料)做成表格

flights = flights.pivot("month", "year", "passengers")  #轉換為座標和對應值關係表格形式

print (flights)

ax = sns.heatmap(flights)

ax = sns.heatmap(flights, annot=True,fmt="d")

ax = sns.heatmap(flights, linewidths=.5)

 

相關文章