在海量的資料中,畫出一張有用的圖,稱為海生圖。也就是在千萬筆資料量中,進行統計分析。
seabron (海生圖) 是用於分類數據的繪圖。常被 import 簡寫成 sns。sns 所繪製的圖表是依附於 matplotlib裏面的,故於最後需使用 plt.show() 將圖表顯示出來。seaborn 可說是matplotlib的加強版。
基於海量資料的分析,這也是賭徒們最愛用的分析圖表,用來分析預測以後會出現在數字。
安裝
pip install seaborn matplotlib numpy。
請特別注意一下,使用 matplotlib 3.5.2的版本會閃退,所以請退回前一個版本 3.5.1。
直方圖 histplot()
histogram[ˋhɪstə͵græm] 用來統計最常座落的地方,及異常的地方。是一種對數據分佈狀況的圖形表示。直方圖為二維統計圖表,兩個坐標分別是統計樣本和該樣本對應的某個屬性的度量。
下面代碼, 使用 numpy產生10000組標準常態分配亂數, 再用sns.displot 統計每個數值出現的次數, 然後依次數繪製直方圖. kde 為 kernel density estimate(核心密度評估)
請注意, set_style需寫為plt.subplot()之前
import seaborn as sns import numpy as np import matplotlib.pyplot as plt sample=np.random.normal(size=10000) print(sample) sns.set_style('whitegrid') plt.subplot(2,2,1) sns.histplot(sample) sns.set_style('ticks') plt.subplot(2,2,2) sns.histplot(sample, kde=False) sns.set_style('darkgrid') plt.subplot(2,2,3) sns.histplot(sample) plt.show() #white, dark, whitegrid, darkgrid, ticks
回歸線圖 lmplot()
底下的程式,先在平面上繪製散落各地的點, fit_reg為設定是否顯示regression(迴歸線).
sns.set()為設定字型及尺寸, 多次設定的話, 以最後一次的設定值為主.
import seaborn as sns import pandas as pd import matplotlib.pyplot as plt import numpy as np x=np.random.randint(1,1000, 100) y=np.random.randint(1,1000, 100) df = pd.DataFrame( {"x": x,"y": y} ) sns.lmplot(data=df, x = "x", y = "y", height=6, fit_reg=True) f=np.poly1d(np.polyfix(df["x"],df["y"], 1)) reg=f(df["x"]) plt.plot(df["x"],reg, c="r", linewidth=0.1) sns.set(font='IPAPMincho', font_scale=1.8) plt.show()
熱度表 HeatMap
當一大堆數值人類無法理解,但其大小卻有相互關連時,可以用顏色的深淺來表示,稱為熱度表。
import pandas as pd import seaborn as sns import pylab as plt import numpy as np data=np.random.random([20,20])#可直接吃 numpy 格式 #data=pd.DataFrame(data=ls)#亦可吃 dDataFrame 格式 sns.heatmap(data, fmt=".2f", annot=True, annot_kws={"size":6}) plt.show()
分類數據圖 catplot()
以大樂透649為例, 共有7個位置, 我們使用下面的代碼列出, 每個位置號碼出現的次數, 以下是由實際的歷史資料演算而得的
swarm
請注意 kind=’swarm’ (成群), 可讓點看起來較鬆散. 另外也可使用jitter=Faslse禁止抖動而成一條線. 但 jitter與kind不可同時混用
import seaborn as sns import pandas as pd import matplotlib.pyplot as plt import mysql.connector as mysql conn=mysql.connect(host="ip",user="account", password="password", database="資料庫") cmd="select * from lotto649 order by lt_date" cursor=conn.cursor() cursor.execute(cmd) rows=cursor.fetchall() x=[] y=[] for row in rows: for i in range(0,7): x.append(i+1) y.append(row[3+i]) df = pd.DataFrame({"x": x,"y": y}) sns.set_style('whitegrid') sns.catplot(data = df, x="x", y="y", kind='swarm') plt.show()
箱線圖
將kind改成box, 即可繪製箱線圖
sns.catplot(data = df, x="x", y="y",kind='box')
Boxen
boxen可顯示更多的資訊, 如下
sns.catplot(data = df, x="x", y="y",kind='boxen')
長條圖 bar
sns.catplot(data = df, x="x", y="y",kind='bar')
線型圖 point
底下統計每個年齡層的死亡人數. 請注意 sns.factorplot()也是線型圖, 但factorplot即將被淘汱, 請不要再使用
import seaborn as sns import pandas as pd import matplotlib.pyplot as plt import numpy as np age = range(0,100, 10) pop = np.random.randint(100,200,10) df = pd.DataFrame( {"age": age, "pop": pop } ) sns.catplot(data = df, x="age", y="pop", kind="point") plt.show()
歷年來大樂透1~49每個號碼出現的次數
import seaborn as sns import pandas as pd import matplotlib.pyplot as plt import mysql.connector as mysql conn=mysql.connect(host="ip",user="account", password="pwd", database="database") cmd="select * from lotto649 order by lt_date" cursor=conn.cursor() cursor.execute(cmd) rows=cursor.fetchall() ls=[] for row in rows: for i in range(0,6): ls.append(row[3+i]) df=pd.DataFrame({"no":ls}) sns.set_style('whitegrid') sns.countplot(data=df, x="no") plt.show()
todo