Vaka | Otobüs her zaman geç mi oluyor? Muhtemelen "bekleme süresi paradoksuna düştünüz (kod indirme ile)

"Açıkçası her 10 dakikada bir oluyor, ancak neredeyse her seferinde 10 dakika beklemem gerekiyor." Bu deneyimden de rahatsız mısınız? Aslında en "şanssız" değilsin, otobüsü beklemek aslında bir olasılık olayı. Yani bu makale olasılıksal modeller ve veri analizi yoluyla bunun nedenlerini açıklıyor Gerçekten teorik analiz gibi mi? Makalede kendi kendinize bulmanız için eksiksiz python kodları ve verileri var. Hayatta sağduyu yaşarken, olasılık modellerini ve python veri analizini de anlayabiliyorum, bu yüzden dikkatlice okumak istemiyorum.

Sık sık otobüse binerseniz, aşağıdaki sahnenin size yabancı olmadığına inanıyorum.

Her 10 dakikada bir çalıştığını iddia eden bir otobüse binmeye hazır olarak istasyona geldiniz. Saatinize bakıyorsunuz ve saati izliyorsunuz ve otobüs 11 dakika sonra nihayet varıyor.

Şu anda yardım edemezsin ama iç çekebilirsin: Şans bugün neden bu kadar kötü!

Bunu da bir düşünün. Otobüsler her 10 dakikada bir kalkıyorsa ve varış saatiniz rastgele ise, ortalama bekleme süreniz 5 dakika değil mi?

Ama aslında otobüs bekleme süresi her zaman beklediğinizden daha uzun görünüyor.

Yanlış mısın Veya otobüs işletim sisteminde bir sorun mu var?

Bazı makul varsayımlar altında harika bir sonuç çıkarabileceğiniz ortaya çıktı:

Ortalama 10 dakikada bir hareket eden bir otobüsü beklerken ortalama bekleme süreniz 10 dakika olacaktır.

Buna bekleme süresi paradoksu denir.

Bekleme süresi paradoksu

Otobüs tam olarak her 10 dakikada bir geliyorsa, ortalama bekleme süreniz bu aralığın yarısıdır: 5 dakika.

Peki ya bu 10 dakikaya biraz rastgele bir bileşen eklersek?

Şu anda bekleme süresi paradoksu ortaya çıkıyor.

Bekleme süresi paradoksu bir tür test paradoksudur. Peki, test paradoksu nedir?

Kısaca, gözlem miktarının olasılığı gözlem miktarı ile ilişkili olduğu sürece bir test paradoksu ortaya çıkacaktır. Örneğin, bir sınıftaki ortalama öğrenci sayısını araştırmak için bir anket yaptık. Okul her sınıfta ortalama 30 öğrenci olduğunu garanti etse de, ankete katılan gerçek ortalama sınıf büyüklüğü genellikle çok daha büyüktür.

Bunun nedeni, daha büyük sınıflarda daha fazla öğrenci bulunmasıdır, bu nedenle ortalama öğrenci deneyimini hesaplarken, daha büyük sınıfları fazla örnekleyeceksiniz. Aşırı olmak gerekirse, bir sınıfta öğrenci yoksa, bu sınıftaki öğrencileri hiç örneklemeyeceksiniz.

Genellikle 10 dakikada bir sefer yapan otobüs hatları için bazen iki otobüs arasındaki aralık 10 dakikadan fazla, bazen daha kısadır. Rastgele bir zamanda gelirseniz, daha kısa bekleme aralıkları yerine daha uzun bekleme aralıklarıyla karşılaşma şansınız artar.

Bu nedenle, yolcuların yaşadığı ortalama bekleme süresi, otobüsler arasındaki ortalama varış zaman aralığından daha uzun olacaktır, çünkü daha uzun aralıklar fazla örneklenmiştir.

Ancak bekleme süresi paradoksu daha şok edici bir öneri sunar.

İki otobüs arasındaki ortalama aralık N dakika olduğunda, yolcuların yaşadığı ortalama bekleme süresi de N / 2 dakika değil, N dakikadır.

bu gerçek mi?

Simülasyon bekleme süresi

Bekleme süresi paradoksunun geçerliliğini kanıtlamak için önce ortalama her 10 dakikada bir gelen otobüslerin akışını simüle edelim.

Deneyin doğruluğunu sağlamak için çok sayıda otobüsün gelişini simüle edeceğiz: 1 milyon araç (veya yaklaşık 19 yıllık kesintisiz varışlar için 10 dakikalık bir aralık).

numpy'yi np olarak içe aktar N = 1000000 # otobüs sayısı tau = gelişler arasında ortalama 10 # dakika rand = np.random.RandomState (42) # evrensel rastgele tohum bus_arrival_times = N * tau * np.sort (rand.rand (N))

Doğru şeyi yaptığımızı doğrulamak için, ortalama aralığın = 10'a yakın olup olmadığını kontrol edelim:

aralıklar = np.diff (bus_arrival_times) intervals.mean ()

Çıktı:

9.9999879601518398

Bu otobüslerin gelişini simüle ederek artık bu dönemde otobüs durağına gelen çok sayıda yolcuyu simüle edebilir ve her birinin yaşadığı bekleme süresini hesaplayabiliriz. Bunu daha sonra kullanmak için bir işlev içinde özetleyelim:

def simulate_wait_times (varış_saatleri, rseed = 8675309, # Jenny'nin rastgele tohumu n_passengers = 1000000): rand = np.random.RandomState (rseed) arrival_times = np.asarray (varış_saatleri) yolcu_saatleri = varış_saatleri.max () * rand.rand (n_p yolcu) # simüle edilen her yolcu için bir sonraki otobüsün dizinini bulun i = np.searchsorted (varış_saatleri, yolcu_saatleri, yan = 'sağ') dönüş varış saatleri -passenger_times

Sonra biraz bekleme süresini simüle edebilir ve ortalamayı hesaplayabiliriz:

wait_times = simulate_wait_times (bus_arrival_times) wait_times.mean ()

Çıktı:

10.001584206227317

Ortalama bekleme süresi 10 dakikaya yakındır. Bekleme süresi paradoksunun öngördüğü gibi.

Daha derine inmek: olasılık ve Poisson süreci

Bu fenomeni nasıl anlıyoruz?

Esasen bu, bir gözlem olasılığının gözlemin kendisiyle ilişkili olduğu bir test paradoks örneğidir. Otobüsler durağa vardıklarında T aralıklarının dağılımını belirtmek için p (T) kullanalım. Bu gösterimde, varış zamanının beklenen değeri:

Yukarıdaki simülasyonda E = = 10 dakika seçtik.

Yolcular otobüs durağına rastgele geldiklerinde, karşılaştıkları zaman aralığının olasılığı p (T) tarafından etkilenecek, aynı zamanda T'nin kendisinden de etkilenecektir: aralık ne kadar uzun olursa, yolcuların bu aralıkla karşılaşma olasılığı o kadar büyük olur. .

Böylece yolcuların tecrübe ettiği varış zamanının dağılımını elde edebiliriz:

Orantılı sabit, normalleştirilmiş dağılımdan gelir:

Yukarıdakilerle karşılaştırıldığında, bunu şu şekilde basitleştirebiliriz:

Beklenen bekleme süresi E yolcuların yaşadığı beklenen aralığın yarısı kadar olacak, bu yüzden yazabiliriz

Veya daha net yazılabilir:

Şimdi p (T) için bir tablo seçelim ve noktaları hesaplayalım.

P (T) seçin

Bu formülü türetmemiz mümkünse, p (T) için makul dağılım nedir?

Simüle edilen varıştaki p (T) dağılımının bir resmini, iki tren arasındaki aralığın histogramını çizerek elde edebiliriz:

% matplotlib satır içi matplotlib.pyplot dosyasını plt olarak içe aktar plt.style.use ('seaborn') plt.hist (aralıklar, bölmeler = np.arange (80), yoğunluk = Doğru) plt.axvline (intervals.mean (), renk = 'siyah', linestyle = 'noktalı') plt.xlabel ('Gelişler arasındaki aralık (dakika)') plt.ylabel ('Olasılık yoğunluğu');

Buradaki dikey kesik çizgi, ortalama aralığın yaklaşık 10 dakika olduğunu gösterir. Bu üstel bir dağılıma çok benziyor ve tesadüfi değil: otobüsün varış zamanını Poisson sürecine çok yakın olan tek tip rastgele bir sayı olarak simüle ediyoruz.Böyle bir süreç için, gelenler arasındaki aralık dağılımının üssel olarak dağıldığı kanıtlanabilir. nın-nin.

Not: Aslında, N nokta, N aralığında düzgün bir şekilde örneklenir ve noktalar arasındaki T aralığı, dağılımını izler: T / (N) ~ Bet. N büyük olduğunda, bu sınır T ~ Exp eğilimindedir.

Aralığın üstel dağılımı, varış zamanının bir Poisson sürecini izlediği anlamına gelir.

Bu çıkarımı tekrar kontrol ederek, Poisson sürecinin başka bir özelliğiyle eşleştiğini doğrulayabiliriz: sabit bir zaman çerçevesinde gelen veri yolu sayısı Poisson dağıtılmış olacaktır. Simülasyonun varış zamanını saat bazında kovalar halinde kontrol edelim:

scipy.stats adresinden içe aktarma poisson # 1 saatlik bölmelerdeki gelenlerin sayısını sayın bölme boyutu = 60 binned_arrivals = np.bincount ((bus_arrival_times // binsize) .astype (int)) x = np.arange (20) # sonuçları planlayın plt.hist (binned_arrivals, bins = x-0.5, yoğunluk = True, alpha = 0.5, label = 'simülasyon') plt.plot (x, poisson (binsize / tau) .pmf (x), 'tamam', etiket = 'Poisson tahmini') plt.xlabel ('Saatlik varış sayısı') plt.ylabel ('frekans') plt.legend ();

Ampirik değer ve teorik değer yakından eşleşir, bu da açıklamamızın doğru olduğuna inanmamızı sağlar: büyük N için, Kişi süreci simüle edilmiş veri yolumuzun varış zamanını iyi tanımlayabilir ve varış aralığı üssel olarak dağıtılır.

Bu, olasılık dağılımının aşağıdaki gibi olduğu anlamına gelir:

Bu olasılık dağılımını yukarıdaki formüle koyarsak, bir kişinin ortalama bekleme süresinin

Yolcuların beklenen bekleme süresi, otobüs gelişleri arasındaki ortalama süre ile aynıdır!

Tamamlayıcı bir çıkarım yöntemi şudur: Poisson süreci hafızasız bir süreçtir, yani olayın tarihsel durumunun bir sonraki olayın beklenen zamanıyla hiçbir ilgisi yoktur. Yani, otobüs durağına vardığınızda, bir sonraki otobüs için ortalama bekleme süresi her zaman aynıdır: bizim durumumuzda, bu 10 dakikadır, bu, önceki otobüsün ne kadar gittiği ile hiçbir ilgisi yoktur!

Aynı ilkeye göre, ne kadar beklediğiniz önemli değil: Bir sonraki otobüsün tahmini varış süresi her zaman 10 dakikadır: Poisson süreci için, beklemek için harcadığınız zaman gereksizdir.

Gerçek bekleme süresi

Poisson süreci gerçek dünya otobüs varış saatini tanımlıyorsa, yukarıdaki analiz doğrudur, ancak durum gerçekten bu mu?

Bekleme süresi paradoksunun gerçeği tanımlayıp açıklamadığını belirlemek için, indirilebilir bazı verileri araştırdık: arrival_times.csv (3MB CSV dosyası)

https://gist.githubusercontent.com/jakevdp/82409002fcc5142a2add0168c274a869/raw/1bbabf78333306dbc45b9f33662500957b2b6dc3/arrival_times.csv

Bu veri seti, 2016'nın ikinci çeyreğinde kaydedilen Seattle şehir merkezindeki 3. ve Pike otobüs durağındaki Seattle Rapid Ride C, D ve E hatlarının planlanan ve gerçek varış zamanlarını içerir.

pandaları pd olarak içe aktar df = pd.read_csv ('arrival_times.csv') df = df.dropna (eksen = 0, nasıl = 'herhangi') df.head ()

Hızlı Yolculuk rota verilerini bilinçli olarak seçtim çünkü günün çoğunda otobüs aralığı çok düzenli, genellikle 10 ila 15 dakika arasında.

Veri temizleme

Öncelikle veriyi temizleyip daha kullanışlı bir forma dönüştürelim:

# tarih ve saati tek bir zaman damgasında birleştirin df = pd.to_datetime (df + '' + df) df = pd.to_datetime (df + '' + df) # planlanmış ve gerçek aralık gece yarısı ise, gerçek günün ayarlanması gerekir dakika = np.timedelta64 (1, 'm') saat = 60 * dakika diff_hrs = (df-df) / saat df.loc - = 24 * saat df.loc + = 24 * saat df = (df-df) / dakika # dahili rota kodlarını harici rota harfleriyle eşleyin df = df.replace ({673: 'C', 674: 'D', 675: 'E'}). astype ('kategori') df = df.replace ({'N': 'kuzeye giden', 'S': 'güneye giden'}). astype ('kategori') # yararlı sütunları ayıklayın df = df.copy () df.head ()

Otobüs ne kadar geç?

Bu tabloda başlıca altı farklı veri kümesi vardır: C, D ve E hatları için kuzeye ve güneye doğru. Özelliklerini anlamak için, bu altı güzergahın gerçek ve planlanan varış saatleri arasındaki farkın bir histogramını çizelim:

seaborn'u sns olarak ithal etmek g = sns.FacetGrid (df, satır = "yön", col = "rota") g.map (plt.hist, "minutes_late", bins = np.arange (-10, 20)) g.set_titles ('{sütun_adı} {satır_adı}') g.set_axis_labels ('dakika geç', 'otobüs sayısı');

Otobüsün yolculuğun başlangıcında her seferinde programına daha yakın olduğunu ve yolculuk sonunda daha fazla farklılık olduğunu düşünebilirsiniz, bu verilerde de teyit edilir: güneye giden C hattı ve kuzeye D ve E hatları kendi rotalarının başlangıcında zaman çizelgesine daha yakınken, ters yön sonda daha yakındır.

Varışlar arasında planlanan ve gözlemlenen zaman aralığı

Ardından, bu altı güzergah için gözlemlenen ve tahmini varış zaman aralıklarına bir göz atalım. Bu aralıkları ayrı ayrı hesaplamak için ilk olarak Pandaların groupby işlevini kullanıyoruz:

def compute_headway (planlanmış): dakika = np.timedelta64 (1, 'm') return programlanmış.sort_values (). diff () / dakika grouped = df.groupby () df = grouped.transform (compute_headway) df = grouped.transform (compute_headway) g = sns.FacetGrid (df.dropna (), satır = "yön", col = "rota") g.map (plt.hist, "gerçek_aralık", bölmeler = np.arange (50) + 0.5) g.set_titles ('{sütun_adı} {satır_adı}') g.set_axis_labels ('gerçek aralık (dakika)', 'otobüs sayısı');

Bunun modelimizin üstel dağılımına benzemediği açıkça görülebileceği gibi, dağılım önceden belirlenmiş sabit olmayan bir varış aralığından da etkilenebilir.

Planlanan varış aralıklarının dağılımını görmek için yukarıdaki tabloyu tekrarlayalım:

Bu, otobüslerin hafta boyunca farklı varış zaman aralıklarına sahip olduğunu gösterir, bu nedenle orijinal varış zamanı verilerinin dağılımından bekleme süresi paradoksunun doğruluğunu değerlendiremeyiz.

g = sns.FacetGrid (df.dropna (), satır = "yön", col = "rota") g.map (plt.hist, "sched_interval", bins = np.arange (20) -0,5) g.set_titles ('{sütun_adı} {satır_adı}') g.set_axis_labels ('planlanmış aralık (dakika)', 'sıklık');

Tekdüze dağıtılmış bir zaman çizelgesi oluşturun

Planlanan varış aralığı düzensiz olsa bile, büyük miktarda varış verisi içeren bazı belirli aralıklar vardır: örneğin, 10 dakikalık planlanmış aralıklarla yaklaşık 2.000 kuzeye doğru E hattı vardır. Bekleme süresi paradoksunun geçerli olup olmadığını keşfetmek için, verileri rotaya, yöne ve önceden belirlenmiş aralığa göre gruplayalım ve ardından bu yaklaşık varış zamanlarını sanki sırayla gerçekleşmiş gibi yeniden paketleyelim. Bu, orijinal verilerin tüm ilgili özelliklerini korurken, bekleme süresi paradoksunun tahminiyle doğrudan karşılaştırmayı kolaylaştırmalıdır.

def stack_sequence (veri): # önce planlanan zamana göre sırala data = data.sort_values ('planlanmış') # verileri yeniden yığınlayın ve ilgili miktarları yeniden hesaplayın data = data.cumsum () veri = veri + veri data = data.sort_values (). diff () verileri döndür alt küme = df grouped = subset.groupby () sequenced = grouped.apply (stack_sequence) .reset_index (drop = True) sequenced.head ()

Bu temizlenmiş verileri kullanarak, farklı rotalar, yönler ve varış sıklıkları için "gerçek" varış aralıklarının dağılımını çizebiliriz:

rota için: g = sns.FacetGrid (sequenced.query (f "rota == '{rota}'"), satır = "yön", col = "zamanlanmış_aralık") g.map (plt.hist, "gerçek_aralık", bölmeler = np.arange (40) + 0.5) g.set_titles ('{row_name} ({col_name: .0f} dakika)') g.set_axis_labels ('gerçek aralık (dakika)', 'sayım') g.fig.set_size_inches (8, 4) g.fig.suptitle (f '{yol} satırı', y = 1.05, yazı tipi boyutu = 14)

Her rota ve zaman çizelgesi için gözlemlenen varış aralığının dağılımının Gauss dağılımına yakın olduğunu, önceden belirlenmiş varış aralığına yakın bir zirveye ulaştığını ve rotanın başlangıcına yakın küçük bir standart sapmaya sahip olduğunu görüyoruz (C, D / E kuzeye (kuzeye)) ve rotanın sonuna yakın daha büyük bir standart sapma.

İstatistiksel test olmasa bile, gerçek varış zaman aralığının kesinlikle üssel olarak dağıtılmadığını açıkça görebiliriz, bu nedenle bekleme süresi paradoksunun dayandığı temel varsayımlar doğru değildir.

Her otobüs güzergahı, yönü ve zaman çizelgesi için ortalama bekleme süresini bulmak için yukarıda kullanılan bekleme süresi simülasyon işlevini kullanabiliriz:

grouped = sequenced.groupby () sims = grouped.apply (simulate_wait_times) sims.apply (lambda süreleri: "{0: .1f} +/- {1: .1f}". format (times.mean (), times.std ()))
Çıktı:

Ortalama bekleme süresi, önceden belirlenmiş zaman aralığının yarısından bir veya iki dakika daha uzun olabilir, ancak bekleme süresi paradoksunun ima ettiği önceden belirlenmiş zaman aralığına eşit değildir. Başka bir deyişle, test paradoksu doğrulanmıştır, ancak bekleme süresi paradoksu gerçeklikle eşleşmiyor gibi görünmektedir.

sonuç olarak

Bekleme süresi paradoksu çok ilginç bir olgudur. Simülasyon, olasılık ve istatistiksel hipotezlerin gerçeklikle karşılaştırılmasını kapsar.

Gerçek dünya otobüs güzergahlarının test paradoksunun bazı versiyonlarını takip ettiğini doğrulamamış olsak da, yukarıdaki analiz, bekleme süresi paradoksunun (otobüsün varış zamanı Poisson sürecini takip eder) arkasındaki temel varsayımın Çok sağlam temeli.

Geriye dönüp bakıldığında, bu şaşırtıcı değildir: Poisson süreci, varış olasılığının son varıştan bu yana tamamen bağımsız olduğunu varsayan hafızasız bir süreçtir. Aslında, iyi işleyen bir toplu taşıma sistemi, bu davranışı önlemek için bilinçli olarak programlanmış bir zaman çizelgesine sahip olacaktır: otobüsler rotalarına günün rastgele saatlerinde başlamayacak, bunun yerine halka en iyi hizmet verenleri seçecektir. Zaman çizelgesi rotasına başlar.

Buradaki daha büyük ders, herhangi bir veri analizi işinin varsayımları konusunda dikkatli olmanız gerektiğidir. Poisson süreci, varış zamanını iyi bir şekilde tanımlayabilir - ancak yalnızca belirli koşullar altında.

Bir veri türü başka bir veri türüne benzediği için, bir veri türü için geçerli bir varsayımın bir başkası için geçerli olması gerektiği sonucuna varılamaz.

Çoğu zaman doğru gibi görünen varsayımlar, gerçeklikle tutarsız sonuçlara yol açabilir. (Kaynak: Büyük Veri Özeti)

Turistler gülümsüyor, yerliler asla gitmiyor
önceki
Küresel yutturmaca düzeyindeki emlak piyasası buz çağına giriyor ve 20 şehirdeki konut fiyat balonu parçalanmak üzere mi?
Sonraki
"Hatırlatma" Kışın gaz zehirlenmesi nasıl önlenir?
Bilişim / Algılama / Bilişsel Zeka ile İlgili Mevcut Araştırma Durumu
Leshan 48 saat boyunca et çorbası! Net olmayan 9 ünlü yemeğin tadı, ölçekte sadece 2 kilogram bilir
Daha sonraki yıllarında, "Eğer başka bir hayat olursa füzelerle uğraşacağım ..." dedi.
DVCON 2019 Entegre Circuit Yüksek -Tech Konferansı | Son gün indirim, acele edin ve indirim fiyatının tadını çıkarın!
Japonya, ABD borcunu ağır bir şekilde satmaya devam ettikten sonra, "durumu düzeltiyor" gibi görünüyor
1993 yılında, erkekler seyahat etmek için okulu bıraktılar ve iki yıl boyunca 60 ülkeye seyahat ettiler, bunu nasıl yaptılar?
Bu figür, onu sırtında taşıyan yaşlı bir anneye benziyor
Odak | 2018'de Dünya Havacılık ve Uzay Ekipmanı Geliştirmeye Genel Bakış
Sincan yeni yarım asırdır ıssız bir gökyüzü yolunu keşfetti, Dukumei'yi ve 318'i Urumçi'ye sadece 1 saat uzaklıkta kötüye kullandı
Hangzhou'daki en iyi restoranlar bu yoldadır! Bu sokağı bir aydır yiyemiyorum
Einsteinın 140. doğum günü: Sizi gerçek bir "Aşk Tanrısı" na yaklaştırın
To Top