在海量的資料中,畫出一張有用的圖,稱為海生圖。也就是在千萬筆資料量中,進行統計分析。
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
