Кения столкнулась с нехваткой топлива, которая переросла в кризис, когда автомобилисты застревали в длинных очередях за заправкой, поскольку крупные заправочные станции сообщали о нехватке топлива.

Нехватка топлива по всей стране была вызвана тем, что с четверга (14 апреля 2022 г.) перебои с поставками должны были уменьшиться после того, как маркетологи увеличили поставки на станции со складов.

Статьи о нехватке топлива и ее причинах. https://nation.africa/kenya/business/why-you-still-can-t-get-fuel-despite-uhuru-sh34bn-intervention-3773538 https://www.theeastafrican.co.ke/ чай/бизнес/топливный кризис-кения-мелким дилерам-3771688

Определение проблемы

Цель здесь состоит в том, чтобы проанализировать данные о топливе с http://www.ikowhere.co.ke/fuel/, недавно созданного веб-сайта, чтобы выяснить, как распределялось топливо по заправочным станциям в округах, городах и районах, о которых сообщается. с 8 по 19 апреля 2022 года.

Данные

Исходный источник данных взят с http://www.ikowhere.co.ke/fuel/. Данные были удалены, чтобы их можно было использовать при анализе, и сохранены в формате csv. Используемым языком программирования был Python, а платформой — блокнот Jupyter.

Функции

Собранные и проанализированные данные состоят из нескольких столбцов, обозначенных как: округ, город, район, дорога, тип топлива, станция и дата.

#Loading libraries to be used
import requests
from bs4 import BeautifulSoup 
from urllib.request import urlopen
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
color = sns.color_palette()
%matplotlib inline
import plotly.offline as py
py.init_notebook_mode(connected=True)
import plotly.graph_objs as go
import plotly.tools as tls
import plotly.express as px

Веб-скраппинг

Веб-скраппинг по определению — это автоматизированный метод, используемый для извлечения больших объемов данных с веб-сайтов. Данные изначально находятся в неструктурированной форме, поскольку веб-скраппинг помогает их собирать и хранить в неструктурированной форме. Просто, чтобы дать краткое описание шагов, предпринятых при утилизации

  1. Найдите URL-адрес, который вы хотите очистить
  2. Проверка страницы
  3. Найдите данные, которые хотите извлечь
  4. Напишите код
  5. Запустите код и извлеките данные
  6. Сохраняйте данные в нужном формате

Для выполнения этой задачи мы будем использовать Beautiful Soup, который представляет собой пакет Python для анализа документов HTML и XML. Полезно легко извлечь данные. Затем мы очищаем данные, а затем используем их для нашего анализа.

#Create an URL oject
URL= "http://www.ikowhere.co.ke/fuel/"
#Create an object page
page=requests.get(URL)
page #Response 200 means the server allows us to collect data from their website
#Parser-lxml = Change html to Python friendly format
#Obtain page's information
soup = BeautifulSoup(page.text,'lxml')
soup
"""After we have found the location of the table now we can define the variable. In this section, we define the table as ‘table1"""
#Obtain information from tag <table>
table1=soup.find('table',
id='customers')
table1

После того, как таблица1 была создана, следующее, что мы можем сделать, это проверить расположение каждого столбца. Если мы посмотрим на каждый столбец, мы заметим, что они имеют одну и ту же характеристику.

После того, как мы нашли тег каждого столбца, следующее, что мы можем сделать, это создать цикл for для заполнения пустого списка каждым столбцом. Мы определяем пустой список как заголовки.

#Obtain every title of columns with tag <th>
headers=[]
for i in table1.find_all('th'):
    title=i.text
    headers.append(title)
"""After the list of columns is made the next thing we can do is create a dataframe. We define the dataframe as mydata."""
#Create a dataframe 
mydata=pd.DataFrame(columns=headers)

Заполнить фрейм данных

После создания фрейма данных мы можем заполнить его элементами в каждом столбце. Прежде чем мы создадим цикл for, нам нужно сначала определить местоположение строки и столбца элемента.

мы можем определить, что строка находится под тегом ‹tr›, а элементы — под тегом ‹td›. Это применяется ко всем строкам и элементам в таблице.

После создания тегов теперь мы можем создать цикл for.

#Create a for loop to fill mydata
for j in table1.find_all('tr')[1:]:
    row_data=j.find_all('td')
    row=[i.text for i in row_data]
    length=len(mydata)
    mydata.loc[length]=row
#Data frame filled with data
mydata.head()
#saving our data frame in a csv file 
petrol_data=mydata.to_csv('D:/DS/petrol_location_ke.csv',index=False)
#Loading the data
petrol_data=pd.read_csv('D:/DS/petrol_location_ke.csv')
#Removing the Click link for details column we shall not use it
petrol_data.drop('Click link for details',axis=1,inplace=True)

Теперь, очистив наши данные, мы можем приступить к их визуализации.

petrol_station=petrol_data['Station '].value_counts()
colors=['mediumturquoise','darkorange','gold','lightgreen']
trace=go.Pie(values=(np.array((petrol_station/petrol_station.sum())*100)),labels=(np.array(petrol_station.index)))
layout=go.Layout(title='Petrol Stations')
data=[trace]
fig=go.Figure(trace,layout)
fig.update_traces(marker=dict(colors=colors,line=dict(color='#000000',width=2)))
fig.show()

Из приведенной выше круговой диаграммы мы видим, что из зарегистрированных заправочных станций чаще всего сообщалось о наличии топлива на заправочных станциях Total (33,3%), за ней следует Shell (29,1%), Rubis (21%), Ola/Oil (3,37%) и Petrocity (2,57%). %.

Сообщалось, что на заправочных станциях, таких как Delta, National Oil, Luqman, Hass и другие, не включенные в список, есть топливо, но они не составляют большинства по сравнению с Shell или Total, поскольку они упали ниже 2% и выше 1%.

Визуализация распределения типов топлива

fuel_type=petrol_data['Fuel Type'].value_counts()
fuel_labels=(np.array(fuel_type.index))
plt.pie(fuel_type,labels=fuel_labels,radius = 2.3,autopct='%.0f%%')
plt.legend(title='Fuel Type')
plt.show()

Что касается наиболее распространенного типа доступного топлива, то на большинстве заправочных станций показатель Super и Diesel составляет 62%, а на тех, где используется только Super/бензин без дизельного топлива, показатель составляет 31%. Топливо только для дизельного топлива и V-power было доступно на 5% и 2% соответственно на перечисленных заправочных станциях.

Распределение АЗС по типу топлива

#Petrol  Station Vs Fuel Type 
fuel_station=petrol_data.loc[:,["Fuel Type","Station "]].groupby(["Fuel Type","Station "]).size().reset_index()
fuel_station.columns=["Fuel Type","Station","Count"]
fig=px.bar(fuel_station,x='Station',y='Count',color="Fuel Type",
          barmode='group',title="Petrol Station Distribution in relation to Fuel Type",
          height=500,width=800)
fig.update_traces(marker_line_color='rgb(9,50,100)',marker_line_width=1.5,opacity=0.6)
fig.show()

Заправочные станции, Total, Shell и Rubis имели более высокие шансы найти типы топлива Super & Diesel, Super/Petrol и только дизельное топливо по сравнению с другими заправочными станциями.

Здесь мы обнаруживаем, что на большинстве заправочных станций Total используется как тип топлива Super, так и дизельное топливо, а на некоторых сообщается только о типах топлива Super/Petrol и Diesel. Это означает, что древесина с большей вероятностью может найти как Super, так и дизельное топливо на большинстве заправочных станций Total, за которыми следуют заправочные станции Shell и Rubis соответственно.

На заправочных станциях Shell из-за продолжающейся нехватки топлива автомобилисты покупали свои V-power в районах, где не было альтернативы.

На заправочных станциях Delta, Ola/Oil, Ливия и Petrocity в равной степени распределялись как супертопливо, так и дизельное топливо.

Распределение АЗС по округам

#Fuel Type vs County
fuel_station=petrol_data.loc[:,["Station ","County"]].groupby(["Station ","County"]).size().reset_index()
fuel_station.columns=["Station ","County","Count"]
fig=px.bar(fuel_station,x='County',y='Count',color="Station ",
          barmode='group',title="Petrol Station Distribution in relation to County",
          height=500,width=1500)
fig.update_traces(marker_line_color='rgb(9,50,100)',marker_line_width=1.5,opacity=0.8)
fig.show()

Большинство зарегистрированных заправочных станций находились в округе Найроби, за которым следовали округа Киамбу, Мачакос, Момбаса и Накуру.

Распределение АЗС по территории

#Fuel Type vs Area
fuel_station=petrol_data.loc[:,["Fuel Type","Area"]].groupby(["Fuel Type","Area"]).size().reset_index()
fuel_station.columns=["Fuel Type","Area","Count"]
fig=px.bar(fuel_station,x='Area',y='Count',color="Fuel Type",
          barmode='group',title="Petrol Station Distribution in relation to it's Area",
          height=500,width=1800)
fig.update_traces(marker_line_color='rgb(9,50,100)',marker_line_width=1.5,opacity=0.8)
fig.show()

Карен сообщает о высокой доступности как Super, так и дизельного топлива, за которыми следуют районы центрального делового района Найроби, районы Westlands, Hurlingham, Langata, Ruiru и Ruaka соответственно.

Заправочные станции только с супер/бензином были обнаружены в таких районах, как Гикомба, Джоска, Университет Кеньятта, Конговеа, Миханго, Нанюки, Ипподром, Циммерман, Гитунгури, Кахавест, Кангеми, Ква Нг'эте, Мачакос, стадион Ньяйо и парки.

Распределение видов топлива по городу

fuel_Area=petrol_data.loc[:,["Fuel Type","Town"]].groupby(["Fuel Type","Town"]).size().reset_index()
fuel_Area.columns=["Fuel Type","Town","Count"]
fig=px.bar(fuel_Area,x='Town',y='Count',color="Fuel Type",
          barmode='group',title="Fuel Type Distribution with Town",
          height=600,width=900,)
fig.update_traces(marker_line_color='rgb(9,50,100)',marker_line_width=1.5,opacity=0.8)
fig.show()

Вот где возникает систематическая ошибка в данных, из пункта сбора данных большинство данных из Найроби и его окрестностей было легко получить по сравнению с данными за пределами Найроби в таких городах, как Элдорет, Нанюки, Килифи, некоторые названия дорог не были указаны.

Это было внезапное решение, я считаю, что команда ikowhere.co.ke, продолжая развивать свою платформу, сможет легко собрать больше данных.

Как Super, так и дизельное топливо были наиболее часто упоминаемыми типами топлива на захваченных заправочных станциях, стоит отметить, что V-power, как сообщается, в основном доступен в Найроби и его городах-спутниках, в Нанюки Super/Petrol был единственным зарегистрированным типом топлива.

Доступность топлива на АЗС в соответствии с заявленной дорогой.

#Petrol Station vs Road
fuel_station=petrol_data.loc[:,["Station ","Road"]].groupby(["Station ","Road"]).size().reset_index()
fuel_station.columns=["Station","Road","Count"]
fig=px.bar(fuel_station,x='Road',y='Count',color="Station",
          barmode='group',title="Petrol Station fuel availability vs Reported Road",
          height=500,width=4000)
fig.update_traces(marker_line_color='rgb(9,50,100)',marker_line_width=1.5,opacity=0.8)
fig.show()

Сообщалось, что на заправочных станциях вдоль улицы Момбасара было больше всего видов топлива, за ними следуют станции вдоль улицы Тика, улицы Вайяки, улицы Лангата, улицы Нгонг, улицы Лимуру, улицы Кангундо, улицы Аргвингс Кодхек, Восточной объездной дороги и дороги Найроби-Накуру. A104 вошли в десятку самых популярных заправочных станций.

Распределение АЗС по дате

fuel_date=petrol_data.loc[:,["Station ","Date"]].groupby(["Station ","Date"]).size().reset_index()
fuel_date.columns=["Station ","Date","Count"]
fig=px.bar(fuel_date,x="Date",y='Count',color="Station ",
          barmode='group',title="Date Distribution and Station",
          height=600,width=1100)
fig.update_traces(marker_line_color='rgb(9,50,100)',marker_line_width=1.5,opacity=0.8)
fig.show()

Судя по загруженным данным, большая часть сообщений поступила в период с 13 по 15 апреля 2022 года. Это та же неделя, когда ребята узнали о сайте, а также когда пересмотренные цены на нефть должны были начаться с 15-го числа.

Заключение

Стоит отметить, что после 15-го числа по новым ценам топливо было доступно на всей заправочной станции, поэтому было мало информации о наличии топлива.

Большинство автомобилистов заправлялись на Total или Shell, а затем на Rubis.

Веб-сайт получил всплеск информации от парней, загружающих информацию во время пика дефицита с датами 13–15 апреля 2022 года.

Основное внимание уделяется Найроби и его окрестностям, было бы также здорово, чтобы детали других городов были хорошо захвачены, поскольку в основном они оставлены как «Нет» или «Другое» (конкретное имя)

Этот анализ был основан на небольшом наборе данных только для того, чтобы показать, как росла доступность топлива на заправочных станциях в районах, о которых сообщалось, что будущая работа потребует сбора большого набора данных. Спасибо команде ikowhere за это.
Используя этот набор данных, можно изучить модель машинного обучения, чтобы прогнозировать доступность топлива на данной заправочной станции с учетом набора функций.

С нетерпением жду ваших отзывов, помогите брату стать лучше, чтобы сделать это лучше.