Làm thế nào để bạn tạo một bản phân phối trong python?

Python  Phân phối Bernoulli là trường hợp phân phối nhị thức trong đó chúng tôi tiến hành một thử nghiệm duy nhất. Đây là phân phối xác suất rời rạc với xác suất p cho giá trị 1 và xác suất q=1-p cho giá trị 0. p có thể là thành công, có, đúng hoặc một. Tương tự, q=1-p có thể là fail, no, false hoặc zero

Vẽ sơ đồ một biến duy nhất có vẻ dễ dàng. Chỉ với một chiều, khó có thể hiển thị dữ liệu một cách hiệu quả như thế nào? . ] Tuy nhiên, gần đây tôi gặp phải một số vấn đề trong đó biểu đồ biểu đồ không thành công và tôi biết đã đến lúc mở rộng kiến ​​thức vẽ biểu đồ của mình. Tôi đã tìm thấy một cuốn sách trực tuyến miễn phí tuyệt vời về trực quan hóa dữ liệu và thực hiện một số kỹ thuật. Thay vì giữ mọi thứ tôi học được cho riêng mình, tôi quyết định sẽ hữu ích [cho bản thân và cho những người khác] để viết một hướng dẫn Python về biểu đồ và một giải pháp thay thế đã được chứng minh là vô cùng hữu ích, biểu đồ mật độ

Bài viết này sẽ xem xét toàn diện cách sử dụng biểu đồ biểu đồ và biểu đồ mật độ trong Python bằng thư viện matplotlib và seaborn. Xuyên suốt, chúng ta sẽ khám phá một bộ dữ liệu trong thế giới thực bởi vì với vô số nguồn có sẵn trực tuyến, không có lý do gì để không sử dụng dữ liệu thực tế. Chúng tôi sẽ trực quan hóa dữ liệu NYCflights13, chứa hơn 300.000 quan sát về các chuyến bay khởi hành từ NYC vào năm 2013. Chúng tôi sẽ tập trung vào việc hiển thị một biến duy nhất, sự chậm trễ đến của các chuyến bay trong vài phút. Mã đầy đủ cho bài viết này có sẵn dưới dạng Jupyter Notebook trên GitHub

Luôn luôn là một ý tưởng hay để kiểm tra dữ liệu của chúng tôi trước khi chúng tôi bắt đầu vẽ đồ thị. Chúng tôi có thể đọc dữ liệu vào khung dữ liệu gấu trúc và hiển thị 10 hàng đầu tiên

import pandas as pd# Read in data and examine first 10 rows
flights = pd.read_csv['data/formatted_flights.csv']
flights.head[10]

Trưởng phòng khung dữ liệu

Thời gian trễ chuyến bay đến tính bằng phút và các giá trị âm có nghĩa là chuyến bay đến sớm [hóa ra các chuyến bay thường có xu hướng đến sớm, chỉ là không bao giờ khi chúng tôi bay trên chuyến bay đó. ] Có hơn 300.000 chuyến bay chậm tối thiểu -60 phút và chậm tối đa 120 phút. Cột khác trong khung dữ liệu là tên của hãng hàng không mà chúng tôi có thể sử dụng để so sánh

biểu đồ

Một cách tuyệt vời để bắt đầu khám phá một biến duy nhất là sử dụng biểu đồ. Biểu đồ chia biến thành các ngăn, đếm các điểm dữ liệu trong mỗi ngăn và hiển thị các ngăn trên trục x và số đếm trên trục y. Trong trường hợp của chúng tôi, các thùng sẽ là một khoảng thời gian biểu thị sự chậm trễ của các chuyến bay và số lượng sẽ là số chuyến bay rơi vào khoảng thời gian đó. Băng thông là tham số quan trọng nhất đối với biểu đồ và chúng ta phải luôn thử một vài giá trị băng thông khác nhau để chọn giá trị tốt nhất cho dữ liệu của mình

Để tạo biểu đồ cơ bản trong Python, chúng ta có thể sử dụng matplotlib hoặc seaborn. Mã bên dưới hiển thị các lệnh gọi hàm trong cả hai thư viện tạo các số liệu tương đương. Đối với các cuộc gọi cốt truyện, chúng tôi chỉ định băng thông theo số lượng thùng. Đối với biểu đồ này, tôi sẽ sử dụng các thùng có độ dài 5 phút, có nghĩa là số lượng thùng sẽ là phạm vi dữ liệu [từ -60 đến 120 phút] chia cho băng thông, 5 phút [ bins = int[180/5]]

Biểu đồ [hình tương đương được tạo bởi cả matplotlib và seaborn]

Đối với hầu hết các biểu đồ cơ bản, tôi sẽ sử dụng mã matplotlib vì nó đơn giản hơn, nhưng chúng ta sẽ sử dụng hàm distplot bẩm sinh sau này để tạo các bản phân phối khác nhau và thật tốt khi làm quen với các tùy chọn khác nhau

Làm cách nào tôi nghĩ ra 5 phút cho băng thông? . Dưới đây là mã để tạo cùng một hình trong matplotlib với một loạt các băng thông. Cuối cùng, không có câu trả lời đúng hay sai cho băng thông, nhưng tôi chọn 5 phút vì tôi nghĩ nó đại diện tốt nhất cho phân phối

Biểu đồ với các băng thông khác nhau

Việc lựa chọn băng thông ảnh hưởng đáng kể đến biểu đồ kết quả. Băng thông nhỏ hơn có thể làm cho biểu đồ trở nên lộn xộn, nhưng băng thông lớn hơn có thể che khuất các sắc thái trong dữ liệu. Matplotlib sẽ tự động chọn băng thông hợp lý cho bạn, nhưng tôi muốn tự chỉ định băng thông sau khi thử một số giá trị. Không có câu trả lời đúng hay sai, vì vậy hãy thử một số tùy chọn và xem tùy chọn nào phù hợp nhất với dữ liệu cụ thể của bạn

Khi biểu đồ thất bại

Biểu đồ là một cách tuyệt vời để bắt đầu khám phá một biến duy nhất được rút ra từ một danh mục. Tuy nhiên, khi chúng tôi muốn so sánh phân phối của một biến trên nhiều danh mục, biểu đồ có vấn đề về khả năng đọc. Ví dụ: nếu chúng tôi muốn so sánh sự phân bổ độ trễ khi đến giữa các hãng hàng không, một cách tiếp cận không hoạt động tốt là tạo biểu đồ cho từng hãng hàng không trên cùng một biểu đồ

Biểu đồ chồng chéo với nhiều hãng hàng không

[Lưu ý rằng trục y đã được chuẩn hóa để giải thích cho số lượng chuyến bay khác nhau giữa các hãng hàng không. Để thực hiện việc này, hãy chuyển đối số

# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
0 cho lệnh gọi hàm
# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
1. ]

Cốt truyện này không hữu ích lắm. Tất cả các thanh chồng chéo khiến việc so sánh giữa các hãng hàng không gần như không thể. Hãy xem xét một vài giải pháp khả thi cho vấn đề phổ biến này

Giải pháp số 1. Biểu đồ cạnh nhau

Thay vì chồng chéo các biểu đồ của hãng hàng không, chúng ta có thể đặt chúng cạnh nhau. Để làm điều này, chúng tôi tạo một danh sách các sự chậm trễ đến cho mỗi hãng hàng không, sau đó chuyển danh sách này vào lệnh gọi hàm

# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
2 dưới dạng danh sách các danh sách. Chúng tôi phải chỉ định các màu khác nhau để sử dụng cho từng hãng hàng không và nhãn để chúng tôi có thể phân biệt chúng. Dưới đây là mã, bao gồm việc tạo danh sách cho từng hãng hàng không

Theo mặc định, nếu chúng ta chuyển vào một danh sách các danh sách, matplotlib sẽ đặt các thanh cạnh nhau. Ở đây, tôi đã thay đổi băng thông thành 15 phút vì nếu không thì cốt truyện quá lộn xộn, nhưng ngay cả với sự sửa đổi này, đây không phải là một con số hiệu quả. Có quá nhiều thông tin để xử lý cùng một lúc, các thanh không khớp với nhãn và vẫn khó so sánh sự phân bổ giữa các hãng hàng không. Khi chúng tôi tạo một cốt truyện, chúng tôi muốn người xem dễ hiểu nhất có thể và con số này không đạt tiêu chí đó. Hãy xem xét một giải pháp tiềm năng thứ hai

Giải pháp số 2. thanh xếp chồng lên nhau

Thay vì vẽ các thanh cho từng hãng hàng không cạnh nhau, chúng ta có thể xếp chúng bằng cách chuyển tham số

# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
3 vào lệnh gọi biểu đồ

# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]

Chà, điều đó chắc chắn không thể tốt hơn. Ở đây, mỗi hãng hàng không được thể hiện dưới dạng một phần của toàn bộ cho mỗi thùng, nhưng gần như không thể so sánh. Ví dụ: ở độ trễ từ -15 đến 0 phút, United Air Lines hoặc JetBlue Airlines có kích thước thanh lớn hơn không? . Tôi thường không phải là người ủng hộ các thanh xếp chồng lên nhau vì chúng có thể khó diễn giải [mặc dù có những trường hợp sử dụng chẳng hạn như khi trực quan hóa tỷ lệ]. Cả hai giải pháp chúng tôi đã thử sử dụng biểu đồ đều không thành công và vì vậy đã đến lúc chuyển sang biểu đồ mật độ

Lô mật độ

Đầu tiên, một biểu đồ mật độ là gì? . Hình thức ước tính phổ biến nhất được gọi là ước tính mật độ hạt nhân. Trong phương pháp này, một đường cong liên tục [nhân] được vẽ tại mọi điểm dữ liệu riêng lẻ và tất cả các đường cong này sau đó được cộng lại với nhau để tạo ra một ước tính mật độ mịn duy nhất. Hạt nhân thường được sử dụng nhất là Gaussian [tạo ra đường cong hình chuông Gaussian tại mỗi điểm dữ liệu]. Nếu, giống như tôi, bạn thấy mô tả đó hơi khó hiểu, hãy xem cốt truyện sau

Ước tính mật độ hạt nhân [Nguồn]

Ở đây, mỗi đường thẳng đứng nhỏ màu đen trên trục x biểu thị một điểm dữ liệu. Các hạt nhân riêng lẻ [Gaussian trong ví dụ này] được hiển thị bằng các đường đứt nét màu đỏ phía trên mỗi điểm. Đường cong liền màu xanh lam được tạo bằng cách tính tổng các Gaussian riêng lẻ và tạo thành biểu đồ mật độ tổng thể

Trục x là giá trị của biến giống như trong biểu đồ, nhưng chính xác thì trục y biểu thị điều gì? . Tuy nhiên, chúng ta cần cẩn thận để xác định đây là mật độ xác suất chứ không phải xác suất. Sự khác biệt là mật độ xác suất là xác suất trên mỗi đơn vị trên trục x. Để chuyển đổi thành xác suất thực tế, chúng ta cần tìm diện tích dưới đường cong trong một khoảng cụ thể trên trục x. Hơi khó hiểu, bởi vì đây là mật độ xác suất chứ không phải xác suất, trục y có thể nhận các giá trị lớn hơn một. Yêu cầu duy nhất của biểu đồ mật độ là tổng diện tích dưới đường cong tích phân thành một. Tôi thường có xu hướng coi trục y trên biểu đồ mật độ là một giá trị chỉ để so sánh tương đối giữa các danh mục khác nhau

Ô mật độ trong Seaborn

Để tạo biểu đồ mật độ ở seaborn, chúng ta có thể sử dụng hàm distplot hoặc

# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
1. Tôi sẽ tiếp tục sử dụng hàm distplot vì nó cho phép chúng tôi thực hiện nhiều bản phân phối với một lần gọi hàm. Ví dụ: chúng ta có thể tạo biểu đồ mật độ hiển thị tất cả độ trễ đến trên biểu đồ tương ứng

# Density Plot and Histogram of all arrival delays
sns.distplot[flights['arr_delay'], hist=True, kde=True,
bins=int[180/5], color = 'darkblue',
hist_kws={'edgecolor':'black'},
kde_kws={'linewidth': 4}]

Biểu đồ mật độ và Biểu đồ sử dụng seaborn

Đường cong hiển thị biểu đồ mật độ về cơ bản là một phiên bản mượt mà của biểu đồ. Trục y là về mật độ và biểu đồ được chuẩn hóa theo mặc định để nó có cùng tỷ lệ y với biểu đồ mật độ

Tương tự như băng thông của một biểu đồ, biểu đồ mật độ có một tham số gọi là băng thông làm thay đổi các hạt nhân riêng lẻ và ảnh hưởng đáng kể đến kết quả cuối cùng của biểu đồ. Thư viện biểu đồ sẽ chọn giá trị băng thông hợp lý cho chúng tôi [theo mặc định sử dụng ước tính 'scott'] và không giống như băng thông của biểu đồ, tôi thường sử dụng băng thông mặc định. Tuy nhiên, chúng ta có thể xem xét sử dụng các băng thông khác nhau để xem có lựa chọn nào tốt hơn không. Trong cốt truyện, 'scott' là mặc định, có vẻ như là lựa chọn tốt nhất

Biểu đồ mật độ Hiển thị các băng thông khác nhau

Lưu ý rằng băng thông rộng hơn dẫn đến phân phối trơn tru hơn. Chúng tôi cũng thấy rằng mặc dù chúng tôi đã giới hạn dữ liệu của mình trong khoảng từ -60 đến 120 phút, biểu đồ mật độ vượt ra ngoài các giới hạn này. Đây là một vấn đề tiềm ẩn với biểu đồ mật độ. bởi vì nó tính toán phân phối tại mỗi điểm dữ liệu, nó có thể tạo dữ liệu nằm ngoài giới hạn của dữ liệu gốc. Điều này có thể có nghĩa là chúng tôi kết thúc với các giá trị không thể trên trục x không bao giờ có trong dữ liệu gốc. Lưu ý, chúng ta cũng có thể thay đổi hạt nhân, thay đổi phân phối được vẽ tại mỗi điểm dữ liệu và do đó thay đổi phân phối tổng thể. Tuy nhiên, đối với hầu hết các ứng dụng, kernel mặc định, Gaussian và ước tính băng thông mặc định hoạt động rất tốt

Giải pháp số 3 Biểu đồ mật độ

Bây giờ chúng ta đã hiểu biểu đồ mật độ được tạo ra như thế nào và biểu đồ đó đại diện cho điều gì, hãy xem biểu đồ này có thể giải quyết vấn đề trực quan hóa sự chậm trễ đến của nhiều hãng hàng không như thế nào. Để hiển thị các bản phân phối trên cùng một biểu đồ, chúng ta có thể lặp lại qua các hãng hàng không, mỗi lần gọi distplot với ước tính mật độ hạt nhân được đặt thành True và biểu đồ được đặt thành False. Dưới đây là mã để vẽ biểu đồ mật độ với nhiều hãng hàng không

Biểu đồ mật độ với nhiều hãng hàng không

Cuối cùng, chúng tôi đã đi đến một giải pháp hiệu quả. Với biểu đồ mật độ, chúng ta có thể dễ dàng so sánh giữa các hãng hàng không vì biểu đồ ít lộn xộn hơn. Bây giờ, cuối cùng chúng ta cũng có đồ thị mong muốn, chúng ta đi đến kết luận rằng tất cả các hãng hàng không này có phân bố thời gian trễ khi đến gần như giống hệt nhau. Tuy nhiên, có các hãng hàng không khác trong tập dữ liệu và chúng ta có thể vẽ một hãng hàng không hơi khác một chút để minh họa một tham số tùy chọn khác cho biểu đồ mật độ, tô màu biểu đồ

Ô mật độ bóng mờ

Điền vào biểu đồ mật độ có thể giúp chúng tôi phân biệt giữa các phân phối chồng chéo. Mặc dù đây không phải lúc nào cũng là một cách tiếp cận tốt, nhưng nó có thể giúp nhấn mạnh sự khác biệt giữa các bản phân phối. Để tô đậm các biểu đồ mật độ, chúng tôi chuyển vào đối số

# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
4 cho đối số
# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
5 trong lệnh gọi distplot

sns.distplot[subset['arr_delay'], hist = False, kde = True,
kde_kws = {'shade': True, 'linewidth': 3},
label = airline]

Biểu đồ mật độ bóng mờ

Có hay không tô màu cốt truyện, giống như các tùy chọn vẽ đồ thị khác, một câu hỏi phụ thuộc vào vấn đề. Đối với biểu đồ này, tôi nghĩ nó có ý nghĩa vì việc tô bóng giúp chúng ta phân biệt các ô trong các vùng mà chúng chồng lên nhau. Bây giờ, cuối cùng chúng tôi có một số thông tin hữu ích. Các chuyến bay của Alaska Airlines có xu hướng sớm hơn United Airlines. Lần tới khi bạn có tùy chọn, bạn biết nên chọn hãng hàng không nào

Lô thảm

Nếu bạn muốn hiển thị mọi giá trị trong một bản phân phối chứ không chỉ mật độ được làm mịn, bạn có thể thêm một biểu đồ thảm. Điều này hiển thị mọi điểm dữ liệu đơn lẻ trên trục x, cho phép chúng tôi trực quan hóa tất cả các giá trị thực tế. Lợi ích của việc sử dụng distplot của seaborn là chúng ta có thể thêm sơ đồ tấm thảm bằng một lệnh gọi tham số duy nhất là

# Stacked histogram with multiple airlines
plt.hist[[x1, x2, x3, x4, x5], bins = int[180/15], stacked=True,
normed=True, color = colors, label=names]
8 [cũng với một số định dạng]

Biểu đồ mật độ với Biểu đồ thảm cho Alaska Airlines

Với nhiều điểm dữ liệu, biểu đồ thảm có thể trở nên quá tải, nhưng đối với một số bộ dữ liệu, có thể hữu ích khi xem mọi điểm dữ liệu. Biểu đồ thảm cũng cho chúng ta thấy biểu đồ mật độ “tạo” dữ liệu như thế nào khi không có dữ liệu nào tồn tại vì nó tạo phân phối hạt nhân tại mỗi điểm dữ liệu. Những bản phân phối này có thể rò rỉ trên phạm vi của dữ liệu gốc và tạo ấn tượng rằng Alaska Airlines có sự chậm trễ ngắn hơn và dài hơn so với thực tế được ghi lại. Chúng ta cần phải cẩn thận về hiện vật này của các biểu đồ mật độ và chỉ ra cho người xem

kết luận

Bài đăng này hy vọng đã cung cấp cho bạn một loạt các tùy chọn để trực quan hóa một biến đơn lẻ từ một hoặc nhiều danh mục. Thậm chí còn có nhiều biểu đồ đơn biến [biến đơn] mà chúng ta có thể tạo, chẳng hạn như biểu đồ mật độ tích lũy theo kinh nghiệm và biểu đồ lượng tử-phân vị, nhưng bây giờ chúng ta sẽ để nó ở biểu đồ biểu đồ và biểu đồ mật độ [và cả biểu đồ thảm. ]. Đừng lo lắng nếu các tùy chọn có vẻ áp đảo. với thực tế, việc đưa ra lựa chọn tốt sẽ trở nên dễ dàng hơn và bạn luôn có thể yêu cầu trợ giúp nếu cần. Hơn nữa, thường không có lựa chọn tối ưu và quyết định “đúng” sẽ phụ thuộc vào sở thích và mục tiêu của hình ảnh hóa. Điều tốt là, bất kể bạn muốn thực hiện cốt truyện nào, sẽ có cách để thực hiện điều đó bằng Python. Hình ảnh hóa là một phương tiện hiệu quả để truyền đạt kết quả và biết tất cả các tùy chọn có sẵn cho phép chúng tôi chọn hình ảnh phù hợp cho dữ liệu của mình

Phân phối trong Python là gì?

Phân phối chuẩn Python là hàm phân phối các biến ngẫu nhiên trong biểu đồ có hình chuông đối xứng . Nó làm như vậy bằng cách sắp xếp phân phối xác suất cho mỗi giá trị.

Ví dụ về phân phối là gì?

Thư viện phân phối

Chủ Đề