Hướng dẫn what is density in python? - mật độ trong python là gì?

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

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 đồ

Một cách tuyệt vời để bắt đầu khám phá một biến duy nhất là với biểu đồ. Một biểu đồ chia biến thành các thùng, đếm các điểm dữ liệu trong mỗi thùng và hiển thị các thùng trên trục x và số lượng 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 đại diện cho sự chậm trễ của các chuyến bay và số lượng sẽ là số lượng chuyến bay rơi vào khoảng đó. Binwidth là tham số quan trọng nhất cho biểu đồ và chúng ta nên luôn thử một vài giá trị khác nhau của binwidth để chọn một giá trị tốt nhất cho dữ liệu của chúng tôi.

Để tạo ra một biểu đồ cơ bản trong Python, chúng ta có thể sử dụng matplotlib hoặc seeborn. Mã bên dưới hiển thị các cuộc gọi chức năng trong cả hai thư viện tạo ra 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 binwidth theo số lượng thùng. Đối với âm mưu này, tôi sẽ sử dụng các thùng có chiều dài 5 phút, điều đó có nghĩa là số lượng thùng sẽ là phạm vi của dữ liệu (từ -60 đến 120 phút) chia cho binwidth, 5 phút (bins = int(180/5)).

Biểu đồ (hình tương đương được sản xuất bởi cả matplotlib và Seaborn)

Đối với hầu hết các biểu đồ cơ bản, tôi sẽ đi với mã matplotlib vì nó đơn giản hơn, nhưng chúng tôi sẽ sử dụng chức năng Seaborn distplot sau này để tạo ra các 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 thế nào tôi nghĩ ra 5 phút cho binwidth? Cách duy nhất để tìm ra một binwidth tối ưu là thử nhiều giá trị! Dưới đây là mã để tạo ra cùng một con số trong matplotlib với một loạt các binwidths. Cuối cùng, không có câu trả lời đúng hay sai cho binwidth, nhưng tôi chọn 5 phút vì tôi nghĩ rằng nó đại diện tốt nhất cho phân phối.

Biểu đồ với các binwidths khác nhau

Sự lựa chọn của binwidth ảnh hưởng đáng kể đến cốt truyện kết quả. Các binwidths nhỏ hơn có thể làm cho cốt truyện lộn xộn, nhưng các binwidth 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 một binwidth hợp lý cho bạn, nhưng tôi muốn tự chỉ định binwidth 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 vài tùy chọn và xem cái nào hoạt động tốt nhất cho 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 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 = True 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.

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.

Mật độ có nghĩa là gì trong Python?

Một biểu đồ mật độ được sử dụng để trực quan hóa phân phối của một biến số liên tục trong một bộ dữ liệu. Nó còn được gọi là lô mật độ hạt nhân. Đó là một thực tế tốt để biết rõ dữ liệu của bạn trước khi bắt đầu áp dụng bất kỳ kỹ thuật học máy nào cho nó.used to visualize the distribution of a continuous numerical variable in a dataset. It is also known as Kernel Density Plots. It's a good practice to know your data well before starting to apply any machine learning techniques to it.

Mật độ trong matplotlib là gì?

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.

Mật độ trong biểu đồ trong Python là gì?

Biểu đồ mật độ là phiên bản liên tục và được làm mịn của biểu đồ được ước tính từ dữ liệu.Nó được ước tính thông qua ước tính mật độ kernel.Trong kernel phương pháp này (đường cong liên tục) được vẽ tại mỗi điểm dữ liệu riêng lẻ và sau đó tất cả các đường cong này được thêm vào với nhau để thực hiện một ước tính mật độ được làm mịn.the continuous and smoothed version of the Histogram estimated from the data. It is estimated through Kernel Density Estimation. In this method Kernel (continuous curve) is drawn at every individual data point and then all these curves are added together to make a single smoothened density estimation.

Mật độ có nghĩa là gì trong dữ liệu?

Để tóm tắt lại, mật độ dữ liệu có thể được nghĩ đến về mặt lấy mẫu hoặc có bao nhiêu mục của một bộ thông tin cụ thể được kiểm tra.Mật độ dữ liệu rất quan trọng vì nó ảnh hưởng đến độ chính xác.Mật độ cao hơn có nghĩa là độ chính xác cao hơn.how many items of a particular information set are examined. Data density is important because it affects accuracy. Higher densities mean more accuracy.