seaborn和pandas-missingno 的資料視覺化--使用畫圖--缺失值分析
目錄
1,熱度圖seaborn--滿足條件的資料的個數如年齡段為2的女生有多少人
2、柱狀圖(檢視其中一個特徵的每一個種類有多少--比如男性有多少,女性有多少)
12、FacetGrid(乾的事情和前面一樣,新的方式吧,這個好像很牛逼)
視覺化使用的資料格式均使用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)
相關文章
- 從靜態到動態化,Python資料視覺化中的Matplotlib和SeabornPython視覺化
- 資料視覺化Seaborn從零開始學習教程(三) 資料分佈視覺化篇視覺化
- [資料分析與視覺化] Python繪製資料地圖2-GeoPandas地圖視覺化視覺化Python地圖
- 一張圖:資料分析師的完整資料視覺化指南圖視覺化
- 資料視覺化最有價值的50個圖表視覺化
- NumPy 隨機資料分佈與 Seaborn 視覺化詳解隨機視覺化
- Python Seaborn綜合指南,成為資料視覺化專家Python視覺化
- Pandas資料視覺化工具——Seaborn用法整理視覺化
- 繪圖和視覺化知識圖譜-《利用Python進行資料分析》繪圖視覺化Python
- python資料分析與視覺化【思維導圖】Python視覺化
- 資料視覺化專案---客源分析趨勢圖視覺化
- 資料視覺化能否代替資料分析視覺化
- 視覺化資料分析軟體視覺化
- 資料視覺化如何選擇合適的視覺化圖表?視覺化
- Python資料分析基礎: 資料缺失值處理Python
- 【Python資料分析基礎】: 資料缺失值處理Python
- 資料視覺化在展館展廳中使用的價值視覺化
- 圖撲視覺化圖表元件之股票資料分析應用視覺化元件
- 資料分析 | 資料視覺化圖表,BI工具構建邏輯視覺化
- 使用 TensorBoard 視覺化模型、資料和訓練ORB視覺化模型
- 資料視覺化——Matpoltlib庫的使用視覺化
- Python資料分析入門(十六):設定視覺化圖表的資訊Python視覺化
- 如何使用Plotly和Dash進行資料視覺化視覺化
- 28個資料視覺化圖表的總結和介紹視覺化
- 資料視覺化圖表之折線圖視覺化
- 資料視覺化Seaborn從零開始學習教程(一) 風格選擇視覺化
- 寶藏級BI資料視覺化功能|圖表聯動分析視覺化
- Python 視覺化 | Seaborn5 分鐘入門 (六)——heatmap 熱力圖Python視覺化
- Python 視覺化 | Seaborn5 分鐘入門 (三)——boxplot 和 violinplotPython視覺化
- Python 視覺化 | Seaborn5 分鐘入門 (四)——stripplot 和 swarmplotPython視覺化Swarm
- Python 視覺化 | Seaborn5 分鐘入門 (一)——kdeplot 和 distplotPython視覺化
- NumPy 正態分佈與 Seaborn 視覺化指南視覺化
- python資料分析與視覺化基礎Python視覺化
- python資料視覺化-matplotlib入門(5)-餅圖和堆疊圖Python視覺化
- 資料視覺化之下發圖實踐視覺化
- Echarts資料視覺化,easyshu圖表整合。Echarts視覺化
- 使用 Python 進行資料視覺化Python視覺化
- 使用 Apache Superset 視覺化 ClickHouse 資料Apache視覺化