Data Visualization (Plotly.express)
Table of Contents
- 1) พื้นฐานการสร้าง Data Visualization
- 2) Customization
- 2.1) ปรับประเภทของ visualization
- 2.2) เพิ่ม channel ของ visualization
- 2.3) เลือกข้อมูลเพิ่มเติมก่อนสร้าง visualization
- 3) แหล่งเรียนรู้เพิ่มเติม
- โดยปกติแล้วเราอาจจะไม่คุ้นชินกับการอ่านข้อมูลขนาดใหญ่ๆ ด้วยตัวเอง
- การใช้ภาพหรือกราฟในการสรุปข้อมูลสามารถทำให้เราเห็นภาพรวมของข้อมูลได้ง่ายขึ้น
- การทำ
data visualization
จึงมีความสำคัญในการนำข้อมูลมาทำให้อยู่ในรูปแบบที่อธิบายต่อได้ง่ายขึ้น - ทั้งนี้โปรแกรมในการทำ
data visualization
มีอยู่มากมายไม่ว่าจะเป็น Microsoft Excel, Google Sheets, หรืออื่นๆ - แต่ในแลปนี้จะมาแนะนำวิธีการใช้ library
plotly.express
ในการทำdata visualization
1) พื้นฐานการสร้าง Data Visualization
เราจะเริ่มด้วยการใช้ข้อมูล gapminder
ที่มีอยู่ใน library plotly.express
หาก labpy ขึ้น error ว่าไม่เจอ plotly ให้รันคำสั่ง !pip install plotly
หากลงแล้วกราฟยังไม่ขึ้นให้ refresh (f5) browser
import plotly.express as px
df = px.data.gapminder()
df.head()
country | continent | year | lifeExp | pop | gdpPercap | iso_alpha | iso_num | |
---|---|---|---|---|---|---|---|---|
0 | Afghanistan | Asia | 1952 | 28.801 | 8425333 | 779.445314 | AFG | 4 |
1 | Afghanistan | Asia | 1957 | 30.332 | 9240934 | 820.853030 | AFG | 4 |
2 | Afghanistan | Asia | 1962 | 31.997 | 10267083 | 853.100710 | AFG | 4 |
3 | Afghanistan | Asia | 1967 | 34.020 | 11537966 | 836.197138 | AFG | 4 |
4 | Afghanistan | Asia | 1972 | 36.088 | 13079460 | 739.981106 | AFG | 4 |
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 country 1704 non-null object
1 continent 1704 non-null object
2 year 1704 non-null int64
3 lifeExp 1704 non-null float64
4 pop 1704 non-null int64
5 gdpPercap 1704 non-null float64
6 iso_alpha 1704 non-null object
7 iso_num 1704 non-null int64
dtypes: float64(2), int64(3), object(3)
memory usage: 106.6+ KB
ข้อมูลจะมีคอลัมภ์ดังนี้
- lifeExp: อายุขัย
- pop: จำนวนประชากร
- gdpPercap: gdp ต่อหัว
สำหรับแต่ละประเทศ (
country
) และปีที่เก็บข้อมูล (year
)
1.1) การใช้งาน plotly.express
px.strip(df, x="gdpPercap")
gdpPercap
ที่มากที่สุดมีค่าเป็นเท่าไร (ตอบเป็นจำนวนเต็ม)
gdpPercap
ที่น้อยที่สุดมีค่าเป็นเท่าไร (ตอบเป็นจำนวนเต็ม)
คำสั่งของ plotly.express
มีการทำงานดังนี้
px
เป็นการเรียก library plotly.express (จากที่เราimport plotly.express as px
).strip(df, x="gdpPercap)
- เป็นการระบุว่าเราจะพลอตกราฟแบบ
strip
(ดูได้จากลิส https://plotly.com/python-api-reference/plotly.express.html) - จากชุดข้อมูล
df
- โดยใช้
gdpPercap
เป็นแกน x
- เป็นการระบุว่าเราจะพลอตกราฟแบบ
และเราสามารถเปลี่ยนจากแกน x เป็น y ได้เช่น
px.strip(df, y="gdpPercap")
อ. จะให้นักเรียนสร้าง data visualization แบบ strip โดยอ.เป็นคนกำหนดค่าบนแกน X และ Y
2) Customization
โค้ดดังต่อไปนี้จะเป็นการดัดแปลงกราฟเพิ่มเติม ให้นักเรียนลองศึกษาความแตกต่างของโค้ดและตัวอย่างกราฟที่เปลี่ยนแปลงไป
โดยจะสร้าง df2002
เพิ่มเติมเพื่อใช้สร้าง data visualization ที่มีข้อมูลเฉพาะปี 2002
df2002 = df[df["year"]==2002]
df2002.head()
country | continent | year | lifeExp | pop | gdpPercap | iso_alpha | iso_num | |
---|---|---|---|---|---|---|---|---|
10 | Afghanistan | Asia | 2002 | 42.129 | 25268405 | 726.734055 | AFG | 4 |
22 | Albania | Europe | 2002 | 75.651 | 3508512 | 4604.211737 | ALB | 8 |
34 | Algeria | Africa | 2002 | 70.994 | 31287142 | 5288.040382 | DZA | 12 |
46 | Angola | Africa | 2002 | 41.003 | 10866106 | 2773.287312 | AGO | 24 |
58 | Argentina | Americas | 2002 | 74.340 | 38331121 | 8797.640716 | ARG | 32 |
2.1) ปรับประเภทของ visualization
px.strip(df2002, x="gdpPercap")
px.scatter(df2002, x="gdpPercap")
scatter
แตกต่างกับ strip
โดย scatter
ไม่สามารถพลอตเพียงแกนเดียวได้
px.bar(df2002, x="gdpPercap")
2.2) เพิ่ม channel ของ visualization
px.scatter(df2002, x="gdpPercap", color="pop")
px.scatter(df2002, x="gdpPercap", y="lifeExp", color="pop")
px.line(df, x="year", y="lifeExp", color="country")
lifeExp
เป็นเท่าไร (ตอบเป็นจำนวนเต็ม)
2.3) เลือกข้อมูลเพิ่มเติมก่อนสร้าง visualization
px.line(df[df["country"] == "China"], x="year", y="lifeExp", color="country")
px.line(df[df["country"].isin(["China", "India", "United States"])], x="year", y="lifeExp", color="country")
isin
คือ "is in" (อยู่ใน) ซึ่งเป็นการเทียบว่าค่าในคอลัมน์นั้นอยู่ในค่าที่กำหนดใน list หรือไม่ โดยจะคืนค่าออกมาเป็น true/false สำหรับแต่ละแถว
px.histogram(df, x="lifeExp")
lifeExp
อยู่ในช่วง 58-59.999 อยู่จำนวนเท่าไร
ให้นักเรียนพลอตรูปดังต่อไปนี้ด้วยตนเอง แล้วอ.จะสุ่มถามวิธีการทำ
HINT: บางรูปจะใช้ข้อมูลจาก df2002