[ad_1]
Phần 1: Phân tích dữ liệu
Chúng tôi muốn bắt đầu với dữ liệu nhưng tôi không có dữ liệu về thời gian “tạm dừng”. Vì vậy, thay vào đó, còn khoảng thời gian giữa các lần chỉnh sửa tệp máy tính thì sao? Một nơi mà tôi thấy thời gian chỉnh sửa như vậy là trên Wikipedia.
Giả sử tôi đặt bạn trên một trang Wikipedia. Bạn có thể chỉ nhìn vào thời gian kể từ lần chỉnh sửa cuối cùng và dự đoán bao lâu nữa sẽ có lần chỉnh sửa tiếp theo không?
Ngoài ra 1: Không công bằng khi tự mình chỉnh sửa trang.
Ngoài ra 2: Tương tự, nếu bằng cách nào đó tôi đặt bạn ở trạng thái “giữ” trong vài phút (cho đến nay), bạn có thể dự đoán bao lâu nữa thì cuộc gọi được kết nối lại không?
Đối với các chỉnh sửa trên trang Wikipedia, bạn có thể diễn đạt dự đoán của mình về thời gian cho đến lần chỉnh sửa tiếp theo như thế nào? Bạn có thể thử dự đoán chính xác thời điểm chỉnh sửa tiếp theo, ví dụ: “Tôi dự đoán trang này sẽ được chỉnh sửa tiếp theo sau đúng 5 ngày, 3 giờ, 20 phút nữa”. Tuy nhiên, điều đó có vẻ quá cụ thể và bạn gần như luôn sai.
Bạn có thể dự đoán nhiều lần: “Tôi dự đoán trang này sẽ được chỉnh sửa tiếp theo vào khoảng thời gian từ nay đến 100 năm sau”. Điều đó gần như luôn đúng nhưng lại mơ hồ và không thú vị.
Một dự đoán thực tế hơn có dạng “thời gian chỉnh sửa tiếp theo trung bình”. Bạn có thể nói: “Tôi dự đoán 50% khả năng trang này sẽ được chỉnh sửa trong vòng 5 ngày, 3 giờ, 20 phút tới.” Tôi, đối thủ của bạn, sẽ chọn “trước” hoặc “sau”. Giả sử tôi nghĩ thời gian chỉnh sửa tiếp theo trung bình thực sự là 3 ngày. Sau đó tôi sẽ chọn “trước”. Sau đó chúng tôi đợi tới 5 ngày, 3 giờ, 20 phút. Nếu bất kỳ ai (một lần nữa, không phải chúng tôi) chỉnh sửa trang trong thời gian đó, tôi sẽ nhận được một điểm; nếu không, bạn sẽ nhận được một điểm. Với hệ thống tính điểm này, nếu bạn là người dự đoán tốt hơn tôi, bạn sẽ kiếm được nhiều điểm hơn.
Tiếp theo chúng ta hãy đi sâu vào Python và xem cách chúng ta có thể đưa ra những dự đoán như vậy:
Chờ đợi kiểu “Đang chờ” – Python
Hãy xem xét bài viết trên Wikipedia về nghệ sĩ Marie Cochran. Chúng ta có thể xem bài viết Lịch sử sửa đổi:
Để thu thập những dữ liệu như vậy từ nhiều bài viết khác nhau trên Wikipedia, tôi đã viết một tập lệnh Python nhỏ:
Ngoài ra: Cách tiếp cận này đưa ra một số vấn đề. Đầu tiên, theo nghĩa nào
Particular:Random
ngẫu nhiên? Tôi không biết. Với mục đích của cuộc trình diễn này, nó có vẻ đủ ngẫu nhiên. Tại sao phải có 50 lần chỉnh sửa mới nhất? Tại sao không phải tất cả các chỉnh sửa? Tại sao không chỉ là bản chỉnh sửa gần đây nhất? Tôi không có lý do chính đáng nào ngoài việc “cập nhật 50 cuối cùng” là mặc định và đủ hiệu quả cho bài viết này. Cuối cùng, tại sao tập lệnh lại chống lại máy chủ Wikipedia thông thường khi thay vào đó chúng ta có thể truy xuất đầy chỉnh sửa lịch sử cho tất cả bài viết từhttps://dumps.wikimedia.org
? Bởi vì chúng tôi chỉ cần một mẫu. Ngoài ra, viết tập lệnh này thì dễ, nhưng viết một chương trình để xử lý toàn bộ dữ liệu thì khó. Đáng buồn thay, tôi sẽ không chia sẻ tập lệnh dễ dàng vì tôi không muốn kích hoạt các bot không được kiểm soát tấn công trang Wikipedia. Hạnh phúc thay, tôi đang chia sẻ trên GitHub tất cả dữ liệu tôi đã thu thập. Bạn có thể sử dụng nó như bạn muốn.
Đây là một đoạn dữ liệu thời gian chỉnh sửa:
Marie_Cochran 01:20, 8 January 2024 01:16, 08 February 2024
Marie_Cochran 01:10, 27 September 2023 01:16, 08 February 2024
Marie_Cochran 00:59, 12 September 2023 01:16, 08 February 2024
Marie_Cochran 11:43, 2 November 2022 01:16, 08 February 2024
...
Marie_Cochran 19:20, 10 March 2018 01:16, 08 February 2024
Peter_Tennant 15:03, 29 July 2023 01:16, 08 February 2024
Peter_Tennant 21:39, 15 April 2022 01:16, 08 February 2024
...
Hãy đọc phần này vào khung dữ liệu Pandas và tính toán Time Delta
thời gian chờ đợi giữa các lần chỉnh sửa:
import pandas as pd# Learn the information
wiki_df = pd.read_csv("edit_history.txt", sep='t', header=None, names=("Title", "Edit DateTime", "Probe DateTime"), usecols=("Title", "Edit DateTime"))
wiki_df('Edit DateTime') = pd.to_datetime(wiki_df('Edit DateTime')) # textual content to datetime
# Type the DataFrame by 'Title' and 'Edit DateTime' to make sure the deltas are calculated accurately
wiki_df.sort_values(by=('Title', 'Edit DateTime'), inplace=True)
# Calculate the time deltas for consecutive edits throughout the identical title
wiki_df('Time Delta') = wiki_df.groupby('Title')('Edit DateTime').diff()
wiki_df.head()
Khung dữ liệu Pandas kết quả bắt đầu bằng bài viết đầu tiên theo thứ tự bảng chữ cái (trong số những bài viết được lấy mẫu). Bài viết đó cho người đọc biết về Öndör Gongormột người rất cao đến từ Mông Cổ:
Trong 50 lần chỉnh sửa gần đây nhất của bài viết đó, chúng tôi thấy bản chỉnh sửa đầu tiên vào ngày 27 tháng 1 năm 2008, lúc 3:13 chiều (UTC). Tiếp theo chúng ta sẽ thấy bản chỉnh sửa 16 phút sau. Việc chỉnh sửa sau đó diễn ra trong vòng một phút (giới hạn độ phân giải của dữ liệu) và do đó hiển thị 0 days 00:00:00
.
Tiếp tục quá trình xử lý của chúng tôi, hãy bỏ NaT
(không phải một lần) xuất hiện ở đầu mỗi bài viết. Chúng tôi cũng sẽ sắp xếp theo thời gian chờ đợi và đặt lại chỉ mục của Panda:
# Take away rows with not-a-time (NaT) values within the 'Time Delta' column
wiki_df.dropna(subset=('Time Delta'), inplace=True)
# Type by time delta and reset the index
wiki_df.sort_values(by='Time Delta', inplace=True)
wiki_df.reset_index(drop=True, inplace=True)
show(wiki_df)
wiki_df('Time Delta').describe()
Điều này tạo ra một khung dữ liệu bắt đầu và kết thúc như thế này:
với bản tóm tắt thống kê này:
rely 36320
imply 92 days 13:46:11.116189427
std 195 days 11:36:52.016155110
min 0 days 00:00:00
25% 0 days 00:27:00
50% 15 days 05:41:00
75% 100 days 21:45:45
max 4810 days 17:39:00
Chúng tôi thấy rằng thời gian chờ lấy mẫu thay đổi từ 0 days 00:00:00
(vì vậy, chưa đầy một phút) đến hơn 13 năm. (13 năm chờ chỉnh sửa chỉ dành cho một bài viết về một tòa nhà ở trường đại học Virginia.) Một phần tư số lần chỉnh sửa diễn ra trong vòng 27 phút kể từ lần chỉnh sửa trước đó. Thời gian trung bình giữa các lần chỉnh sửa chỉ hơn 15 ngày.
Trước khi chúng ta đi xa hơn, tôi muốn cải thiện việc hiển thị thời gian chờ bằng một chức năng nhỏ:
def seconds_to_text(seconds):
seconds = spherical(seconds)
end result = ()
for unit_name, unit_seconds in (('y', 86400 * 365.25),('d', 86400),('h', 3600),('m', 60),('s', 1)):
if seconds >= unit_seconds:
unit_value, seconds = divmod(seconds, unit_seconds)
end result.append(f"{int(unit_value)}{unit_name}")
return ' '.be part of(end result) if end result else "<1s"seconds_to_text(100)
Các seconds_to_text
chức năng hiển thị 100 giây như '1m 40s'
.
Với điều này, chúng ta có thể xây dựng bảng “chờ đợi” cho dữ liệu Wikipedia. Do thời gian chờ đợi cho lần chỉnh sửa tiếp theo của một bài viết cho đến nay, bảng này cho biết thời gian chờ bổ sung trung bình của chúng tôi. (Hãy nhớ lại rằng “trung bình” có nghĩa là một nửa thời gian, chúng tôi dự kiến sẽ đợi ít hơn thời gian này để chỉnh sửa. Nửa thời gian còn lại, chúng tôi dự kiến sẽ đợi nhiều hơn thời gian này.)
import numpy as npdef wait_wait_table(df, wait_ticks):
sorted_time_deltas_seconds = df('Time Delta').dt.total_seconds()
outcomes = ()
for wait_tick in wait_ticks:
greater_or_equal_values = sorted_time_deltas_seconds(sorted_time_deltas_seconds >= wait_tick)
median_wait = np.median(greater_or_equal_values)
additional_wait = median_wait - wait_tick
outcomes.append({"Wait So Far": seconds_to_text(wait_tick), "Median Further Wait": seconds_to_text(additional_wait)})
return pd.DataFrame(outcomes)
wiki_wait_ticks = (0, 60, 60*5, 60*15, 3600, 3600*4, 86400, 86400 * 7,86400 * 30, 86400 * 100, 86400 * 365.25, 86400 * 365.25 * 5, 86400 * 365.25 * 10)
wiki_wait_tick_labels = (seconds_to_text(wait_tick) for wait_tick in wiki_wait_ticks)
wait_wait_table(wiki_df, wiki_wait_ticks).fashion.cover(axis="index")
Tiếp theo chúng ta sẽ thảo luận về kết quả của bảng này.
Chờ đợi kiểu “Đang chờ” – Thảo luận
Mã Python trước tạo ra bảng này. Gọi nó là bàn “chờ-chờ”.
Bảng cho biết rằng nếu chúng ta không đợi chút nào (nói cách khác, ai đó vừa chỉnh sửa trang), chúng ta có thể dự đoán lần chỉnh sửa tiếp theo chỉ sau hơn 15 ngày. Tuy nhiên, nếu sau một phút không có ai chỉnh sửa lại bài viết, chúng ta có thể phải chờ 19 ngày. Do đó, việc chờ đợi một phút sẽ khiến thời gian chờ đợi dự kiến tăng thêm gần 4 ngày. Nếu sau một giờ không có ai chỉnh sửa bài viết, thời gian chờ đợi bổ sung dự kiến của chúng tôi sẽ tăng hơn gấp đôi lên 47 ngày.
Ngoài ra: Khi tôi sử dụng thuật ngữ ‘dự đoán’ trong ngữ cảnh này, tôi đang đề cập đến thời gian chờ đợi trung bình được lấy từ dữ liệu lịch sử của chúng tôi. Nói cách khác, dựa trên các xu hướng trong quá khứ, chúng tôi đặt cược rằng một nửa số lần chỉnh sửa tiếp theo sẽ diễn ra sớm hơn khung thời gian này và một nửa sẽ diễn ra muộn hơn.
Một cách để nghĩ về hiện tượng này: Khi bắt đầu chờ đợi lần chỉnh sửa tiếp theo, chúng tôi không biết mình đang ở trang nào. Đây có phải là bài viết về một chủ đề văn hóa đại chúng đang scorching như Taylor Swift
? Hay đây là một bài viết về một chủ đề thích hợp, diễn biến chậm chẳng hạn như Rotunda, tòa nhà của trường đại học 5000 sinh viên. Với mỗi phút trôi qua mà không có sự chỉnh sửa nào, rất có thể đây sẽ là một bài viết giống Taylor-Swift và chuyển sang một bài viết giống The-Rotunda.
Tương tự như vậy, khi chúng ta gọi tới bộ phận dịch vụ khách hàng và bị chờ máy – ngay từ đầu, chúng ta không biết mình đang chờ đợi loại dịch vụ khách hàng nào. Tuy nhiên, cứ mỗi phút trôi qua, chúng tôi lại biết rằng có thể chúng tôi đang phải chờ đợi dịch vụ khách hàng kém, chậm. Do đó, sự chờ đợi bổ sung dự kiến của chúng tôi sẽ tăng lên.
Cho đến thời điểm này, chúng tôi đã sử dụng dữ liệu trực tiếp. Chúng ta cũng có thể thử mô hình hóa dữ liệu với phân bố xác suất. Tuy nhiên, trước khi chuyển sang mô hình hóa, chúng ta hãy xem hai ví dụ khác: hâm nóng bỏng ngô trong lò vi sóng và chờ trúng xổ số.
Hãy áp dụng các kỹ thuật từ chờ chỉnh sửa Wikipedia đến chờ bỏng ngô bằng lò vi sóng. Thay vì thu thập dữ liệu thực (ngon nhất có thể), tôi hài lòng với việc mô phỏng dữ liệu. Chúng tôi sẽ sử dụng một trình tạo số ngẫu nhiên. Chúng tôi giả định rằng thời gian nấu, có lẽ dựa trên cảm biến, là 5 phút cộng hoặc trừ 15 giây.
Chờ đợi kiểu “Bỏng ngô” – Python
Cụ thể bằng Python:
seed = 0
rng = np.random.default_rng(seed)
sorted_popcorn_time_deltas = np.kind(rng.regular(5*60, 15, 30_000))
popcorn_df = pd.DataFrame(pd.to_timedelta(sorted_popcorn_time_deltas,unit="s"), columns=("Time Delta"))
print(popcorn_df.describe())
Tạo ra khung dữ liệu Panda với bản tóm tắt thống kê này:
Time Delta
rely 30000
imply 0 days 00:05:00.060355606
std 0 days 00:00:14.956424467
min 0 days 00:03:52.588244397
25% 0 days 00:04:50.011437922
50% 0 days 00:04:59.971380399
75% 0 days 00:05:10.239357827
max 0 days 00:05:59.183245298
Đúng như mong đợi, khi tạo dữ liệu từ phân phối chuẩn này, giá trị trung bình là 5 phút và độ lệch chuẩn là khoảng 15 giây. Thời gian chờ mô phỏng của chúng tôi dao động từ 3 phút 52 giây đến 6 phút.
Bây giờ chúng ta có thể tạo bảng “chờ-chờ”:
wait_wait_table(popcorn_df, (0, 10, 30, 60, 2*60, 3*60, 4*60, 5*60)).fashion.cover(axis="index")
Chờ đợi kiểu “bỏng ngô” – Thảo luận
Bảng “chờ-chờ” cho bỏng ngô của chúng tôi trông như thế này:
Bảng của chúng tôi cho biết lúc đầu, chúng tôi dự kiến sẽ đợi 5 phút. Sau khi chúng tôi đợi 10 giây, thời gian chờ dự kiến bổ sung của chúng tôi giảm xuống đúng 10 giây (còn 4 phút 50 giây). Sau khi chúng tôi đợi một phút, thời gian chờ bổ sung của chúng tôi giảm xuống còn 4 phút, v.v. Sau 5 phút, thời gian chờ bổ sung dự kiến tiếp tục giảm xuống (nhưng không bằng 0).
Trong phần sau, chúng ta sẽ xem cách lập mô hình dữ liệu này. Bây giờ, chúng ta hãy xem phần tiếp theo là chờ đợi trúng xổ số.
Đối với dữ liệu xổ số, tôi lại thoải mái tạo dữ liệu mô phỏng. Xổ số Bang Washington đưa ra tỷ lệ thắng từ 1 đến 27,1. (Trận thắng phổ biến nhất, trả 3 đô la cho lần đặt cược 1 đô la.) Hãy chơi xổ số trong 1 triệu tuần (khoảng 19.000 năm) và thu thập dữ liệu về thời gian chờ đợi giữa các lần thắng.
“Trúng xổ số” – Kiểu chờ đợi — Python
Chúng tôi mô phỏng 1 triệu tuần chơi xổ số:
seed = 0
rng = np.random.default_rng(seed)
last_week_won = None
lotto_waits = ()
for week in vary(1_000_000):
if rng.uniform(excessive=27.1) < 1.0:
if last_week_won isn't None:
lotto_waits.append(week - last_week_won)
last_week_won = week
sorted_lotto_time_deltas = np.kind(np.array(lotto_waits) * 7 * 24 * 60 * 60)
lotto_df = pd.DataFrame(pd.to_timedelta(sorted_lotto_time_deltas,unit="s"), columns=("Time Delta"))
print(lotto_df.describe())
Time Delta
rely 36773
imply 190 days 08:21:00.141951976
std 185 days 22:42:41.462765808
min 7 days 00:00:00
25% 56 days 00:00:00
50% 133 days 00:00:00
75% 259 days 00:00:00
max 2429 days 00:00:00
Khoảng thời gian ngắn nhất có thể giữa các chiến thắng của chúng tôi là 7 ngày. Đợt khô hạn mô phỏng dài nhất của chúng tôi là hơn 6 năm. Thời gian chờ đợi trung bình của chúng tôi là 133 ngày.
Chúng tôi tạo bảng “chờ-chờ” với:
lotto_days = (0, 7, 7.00001, 2*7, 4*7, 183, 365.25, 2*365.25, 5*365.25)
lotto_waits = (day * 24 * 60 * 60 for day in lotto_days)
wait_wait_table(lotto_df, lotto_waits).fashion.cover(axis="index")
“Trúng xổ số”-kiểu chờ đợi — Thảo luận
Đây là bảng “chờ-chờ”:
Bảng cho thấy xổ số không quan tâm chúng ta đã chờ đợi chiến thắng bao lâu. Cho dù chúng ta vừa thắng (Wait So Far < 1s
) hoặc chưa giành chiến thắng trong một năm, thời gian chờ đợi bổ sung dự kiến của chúng tôi cho đến lần giành chiến thắng tiếp theo hầu như luôn nằm trong khoảng từ 126 ngày đến 133 ngày.
Ba mục trên bàn có vẻ lạ. Bạn nghĩ chuyện gì đang xảy ra ở 7d
Và 7d 1s
? Tại sao thời gian chờ đợi bổ sung lại tăng vọt, gần như ngay lập tức từ 126 ngày lên khoảng 133 ngày? Câu trả lời là tại thời điểm quay số hàng tuần, thời gian chờ đợi tối thiểu để giành chiến thắng sẽ thay đổi từ 0 ngày lên 7 ngày. Và thế còn 5y
? Phải chăng điều này cho thấy nếu chờ 5 năm, chúng ta có thể đoán trước được chiến thắng chỉ trong 50 ngày, ít hơn nhiều so với 133 ngày thông thường? Thật đáng buồn không. Đúng hơn là nó cho thấy giới hạn của dữ liệu của chúng tôi. Trong dữ liệu, chúng tôi chỉ thấy ba lần chờ đợi 5 năm:
lotto_df(lotto_df("Time Delta") > pd.to_timedelta(24*60*60 * 365.25 * 5, unit="s"))
Ba giá trị dẫn đến ước tính nhiễu của giá trị trung vị.
[ad_2]
Source link