Hướng dẫn density histogram python - biểu đồ mật độ python

Trực quan hóa dữ liệu một chiều trong Python

Nội dung chính ShowShow

  • Biểu đồ
  • Khi biểu đồ thất bại
  • Giải pháp số 1: Biểu đồ bên cạnh
  • Giải pháp số 2: Thanh xếp chồng
  • Sơ đồ mật độ
  • Các lô mật độ trong Seaborn
  • Giải pháp số 3 Biểu đồ mật độ
  • Sơ đồ mật độ bóng mờ
  • Cốt truyện thảm
  • Kết luận
  • Làm thế nào để bạn thêm mật độ vào biểu đồ?
  • Làm thế nào để bạn vẽ một hàm mật độ trong Python?
  • Làm thế nào để bạn phủ lên một âm mưu mật độ?
  • Mật độ làm gì trong plt hist ()?

Vẽ một biến duy nhất có vẻ như nó sẽ dễ dàng. Chỉ với một chiều, làm thế nào khó có thể hiển thị dữ liệu một cách hiệu quả? Trong một thời gian dài, tôi đã nhận được bằng cách sử dụng biểu đồ đơn giản cho thấy vị trí của các giá trị, sự lây lan của dữ liệu và hình dạng của dữ liệu (bình thường, sai lệch, lưỡng kim, v.v.) Một biểu đồ thất bại và tôi biết rằng đã đến lúc mở rộng kiến ​​thức âm mưu của tôi. 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 với bản thân, tôi quyết định nó sẽ hữu ích (cho bản thân và cho 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, mật độ.

Bài viết này sẽ có một cái nhìn toàn diện về bằng cách sử dụng biểu đồ và sơ đồ mật độ trong Python bằng các thư viện matplotlib và Seaborn. Trong suốt, chúng tôi sẽ khám phá một bộ dữ liệu trong thế giới thực bởi vì với sự giàu có của các 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 NYCFlight13, trong đó có hơn 300.000 chuyến bay khởi hành 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, độ trễ 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 máy tính xách tay Jupyter trên GitHub.

Nó luôn luôn là một ý tưởng tốt để kiểm tra dữ liệu của chúng tôi trước khi chúng tôi bắt đầu âm mưu. Chúng ta có thể đọc dữ liệu vào một chiếc Pandas DataFrame 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)
đầu của DataFrame

Sự chậm trễ của chuyến bay là trong vài phút và các giá trị âm có nghĩa là chuyến bay sớm (hóa ra các chuyến bay thường có xu hướng đến sớm, không bao giờ khi chúng tôi đi trên chúng!) Có hơn 300.000 chuyến bay với độ trễ tối thiểu là -60 phút và Độ trễ tối đa là 120 phút. Cột khác trong DataFrame là tên của hãng hàng không mà chúng ta có thể sử dụng để so sánh.

Biểu đồ

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

Giải pháp số 1: Biểu đồ bên cạnh

Giải pháp số 2: Thanh xếp chồng

Sơ đồ mật độ

Các lô mật độ trong Seaborn

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

Sơ đồ mật độ bóng mờ

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 các phân phối của một biến trên nhiều loại, biểu đồ có vấn đề với khả năng đọc. Ví dụ: nếu chúng ta muốn so sánh các phân phối độ trễ đế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 mỗi hãng hàng không trên cùng một lô:

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

.

Cốt truyện này không hữu ích lắm! Tất cả các thanh chồng chéo làm cho gần như không thể so sánh giữa các hãng hàng không. Hãy cùng 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 đồ bên cạnh

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 độ trễ đến cho mỗi hãng hàng không, sau đó chuyển điều này vào lệnh gọi chức năng plt.hist dưới dạng danh sách danh sách. Chúng tôi phải chỉ định các màu khác nhau để sử dụng cho mỗi hãng hàng không và một nhãn để chúng tôi có thể phân biệt chúng. Mã, bao gồm việc tạo danh sách cho mỗi hãng hàng không dưới đây:

Theo mặc định, nếu chúng ta chuyển trong danh sách các danh sách, Matplotlib sẽ đặt các thanh cạnh nhau. Ở đây, tôi đã thay đổi binwidth thành 15 phút vì nếu không, cốt truyện quá lộn xộn, nhưng ngay cả với 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 phù hợp với các nhãn và nó vẫn khó so sánh các phân phối giữa các hãng hàng không. Khi chúng tôi tạo ra một cốt truyện, chúng tôi muốn nó dễ dàng hiểu người xem càng tốt, và con số này thất bại bởi tiêu chí đó! Hãy cùng 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

Thay vì vẽ các thanh cho mỗi 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)
0 cho cuộc 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)

Vâng, đó chắc chắn không tốt hơn! Ở đây, mỗi hãng hàng không được đại diện như một phần của toàn bộ cho mỗi thùng, nhưng nó gần như không thể so sánh được. Ví dụ, ở độ trễ từ -15 đến 0 phút, United Air Lines hoặc JetBlue Airlines có kích thước lớn hơn của thanh? Tôi có thể nói với người xem và người xem đã giành chiến thắ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 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, thời gian để chuyển sang biểu đồ mật độ.

Sơ đồ mật độ

Đầu tiên, âm mưu mật độ là gì? Một biểu đồ mật độ là một phiên bản được làm mịn, liên tục của biểu đồ được ước tính từ dữ liệu. 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 (hạt 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 thêm vào với nhau để thực hiện một ước tính mật độ trơn tru duy nhất. Hạt nhân thường được sử dụng là Gaussian (tạo ra đường cong 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 màu đen nhỏ trên trục X đại diện cho 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ị được vẽ theo các đường màu đỏ đứt nét phía trên mỗi điểm. Đường cong màu xanh rắn được tạo ra bằng cách tổng hợp 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 đại diện cho điều gì? Trục Y trong biểu đồ mật độ là hàm mật độ xác suất để ước tính mật độ hạt nhân. Tuy nhiên, chúng ta cần cẩn thận để xác định đây là mật độ xác suất và không phải là 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 khu vực dưới đường cong cho một khoảng cụ thể trên trục x. Một cách khó hiểu, bởi vì đây là mật độ xác suất và không phải là xác suất, trục y có thể lấy 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 hợp thành một. Tôi thường có xu hướng nghĩ về trục y trên một biểu đồ mật độ chỉ là một giá trị chỉ để so sánh tương đối giữa các loại khác nhau.

Các lô mật độ trong Seaborn

Để tạo các lô mật độ trong 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 chức năng 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 cuộc gọi chức năng. Ví dụ: chúng ta có thể tạo ra một biểu đồ mật độ hiển thị tất cả sự chậm trễ đến trên đầu biểu đồ tương ứng:Biểu đồ và biểu đồ mật độ bằng cách sử dụng Seaborn

Đường cong cho thấy biểu đồ mật độ về cơ bản là phiên bản mượt mà của biểu đồ. Trục Y về mật độ và biểu đồ được chuẩn hóa theo mặc định để nó có quy mô Y giống như biểu đồ mật độ.

Tương tự như binwidth của biểu đồ, một biểu đồ mật độ có một tham số gọi là băng thông 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 cốt truyện. Thư viện âm mưu sẽ chọn một giá trị hợp lý của băng thông cho chúng tôi (theo mặc định bằng cách sử dụng ước tính ‘Scott Scott) và không giống như binwidth 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 liệu có lựa chọn nào tốt hơn không. Trong cốt truyện, ‘Scott, là mặc định, trông giống như tùy chọn tốt nhất.bandwidththat changes the individual kernels and significantly affects the final result of the plot. The plotting library will choose a reasonable value of the bandwidth for us (by default using the ‘scott’ estimate), and unlike the binwidth of a histogram, I usually use the default bandwidth. However, we can look at using different bandwidths to see if there is a better choice. In the plot, ‘scott’ is the default, which looks like the best option.bandwidththat changes the individual kernels and significantly affects the final result of the plot. The plotting library will choose a reasonable value of the bandwidth for us (by default using the ‘scott’ estimate), and unlike the binwidth of a histogram, I usually use the default bandwidth. However, we can look at using different bandwidths to see if there is a better choice. In the plot, ‘scott’ is the default, which looks like the best option.

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

Lưu ý rằng một băng thông rộng hơn dẫn đến việc làm mịn nhiều phân phối 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 xuống còn -60 đến 120 phút, nhưng 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ăng 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 ta 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! Một lưu ý, chúng ta cũng có thể thay đổi kernel, thay đổi phân phối được rút ra tại mỗi điểm dữ liệu và do đó 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 tôi đã hiểu cách tạo ra một âm mưu mật độ và những gì nó đại diện, hãy để xem cách nó có thể giải quyết vấn đề của chúng tôi khi hình dung sự chậm trễ đến của nhiều hãng hàng không. Để hiển thị các bản phân phối trên cùng một lô, chúng tôi có thể lặp lại thông 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 sai. Mã để vẽ biểu đồ mật độ với nhiều hãng hàng không ở bên dưới:

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

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

Sơ đồ mật độ bóng mờ

Điền vào biểu đồ mật độ có thể giúp chúng ta 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à 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 phân phối. Để che bóng các sơ đồ mật độ, chúng tôi chuyển qua

# 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 cuộc gọi distplot.
sns.distplot(subset['arr_delay'], hist = False, kde = True,
kde_kws = {'shade': True, 'linewidth': 3},
label = airline)
Lô mật độ

Có hay không che bóng cốt truyện hay không, giống như các tùy chọn âm mưu 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ĩ rằng nó có ý nghĩa bởi vì bóng giúp chúng ta phân biệt các lô trong các khu vực nơi chúng trùng lặp. Bây giờ, cuối cùng chúng tôi cũng có một số thông tin hữu ích: các chuyến bay Alaska Airlines có xu hướng sớm hơn so với 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!

Cốt truyện thảm

Nếu bạn muốn hiển thị mọi giá trị trong phân phối và không chỉ mật độ được làm mịn, bạn có thể thêm một lô thảm. Điều này cho thấy mọi điểm dữ liệu 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 Seaborn từ distplot là chúng ta có thể thêm sơ đồ thảm với một cuộc 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 (với một số định dạng cũng như vậy).Lô mật độ với lô thảm cho Alaska Airlines

Với nhiều điểm dữ liệu, lô thảm có thể bị quá tải, nhưng đối với một số bộ dữ liệu, có thể hữu ích để xem mọi điểm dữ liệu. Biểu đồ thảm cũng cho phép chúng ta xem biểu đồ mật độ như thế nào tạo ra dữ liệu trên mạng, nơi không có gì tồn tại bởi vì nó tạo ra phân phối kernel tại mỗi điểm dữ liệu. Các phân phối này có thể rò rỉ trong phạm vi dữ liệu gốc và tạo ấn tượng rằng Alaska Airlines có độ trễ vừa ngắn hơn và dài hơn thực tế được ghi lại. Chúng ta cần cẩn thận về cổ vật của các lô mật độ này và chỉ ra nó 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 duy nhất từ ​​một hoặc nhiều loại. Thậm chí còn có nhiều lô đơn biến (biến đơn) hơn, chúng ta có thể thực hiện như các ô mật độ tích lũy theo kinh nghiệm và các lô số lượng tử, nhưng bây giờ chúng ta sẽ để nó ở biểu đồ và sơ đồ mật độ (và các lô thảm cũng vậy!). Don Tiết lo lắng nếu các tùy chọn có vẻ quá sức: với thực tiễn, 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 giúp đỡ nếu cần. Hơn nữa, thường thì có một sự lựa chọn tối ưu và quyết định của bên phải sẽ đi vào sở thích và các mục tiêu của hình dung. Điều tốt là, bất kể bạn muốn thực hiện cốt truyện nào, sẽ có một cách để làm điều đó trong Python! Trực quan 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 đúng con số cho dữ liệu của chúng tôi.

Tôi hoan nghênh phản hồi và phê bình mang tính xây dựng và có thể đạt được trên Twitter @Koehrsen_will.

Làm thế nào để bạn thêm mật độ vào biểu đồ?

Một biểu đồ cơ bản có thể được tạo ra với hàm hist. Để thêm một đường cong bình thường hoặc đường mật độ, bạn sẽ cần tạo một lập trình biểu đồ mật độ Prob = true làm đối số.create a density histogram setting prob = TRUE as argument.create a density histogram setting prob = TRUE as argument.

Làm thế nào để bạn vẽ một hàm mật độ trong Python?

DataFrame -> Cột mà biểu đồ mật độ sẽ được vẽ ..

Biểu đồ -> Từ khóa chỉ đạo để vẽ một biểu đồ/biểu đồ cho cột đã cho ..

Mật độ -> Để vẽ đồ thị mật độ ..

KDE -> Để vẽ đồ thị mật độ bằng cách sử dụng hàm ước tính mật độ kernel ..

Làm thế nào để bạn phủ lên một âm mưu mật độ?

Lớp phủ hai ô mật độ có vẻ phức tạp, nhưng nó đơn giản như vẽ một biểu đồ mật độ tương tự.Đối với mọi lô khác, bạn chỉ cần tiếp tục gọi hàm với mật độ tương ứng của chúng và thêm cơ chế cần thiết của chúng vào các chức năng ngoại trừ cơ chế đầu tiên để tiếp tục vẽ chúng trên cùng một lô.plotting a same density graph. For every other plot you just have to keep calling the function with their respective density and add their required mechanism to functions except the first one to keep drawing them on the same plot.plotting a same density graph. For every other plot you just have to keep calling the function with their respective density and add their required mechanism to functions except the first one to keep drawing them on the same plot.

Mật độ làm gì trong plt hist ()?

Tham số mật độ, giúp bình thường hóa độ cao bin sao cho tích phân của biểu đồ là 1. Biểu đồ kết quả là một xấp xỉ của hàm mật độ xác suất.normalizes bin heights so that the integral of the histogram is 1. The resulting histogram is an approximation of the probability density function.normalizes bin heights so that the integral of the histogram is 1. The resulting histogram is an approximation of the probability density function.