Exploratory Data Analysis: Bridges in Nepal
Bridges are vital infrastructures in the development process. Moreover, in a mountainous country like Nepal with many thousands of rivers and streams, bridges play a vital role in connecting roads, villages and cities and hence moving the economy.
This is my first data analysis project whereby I explore the bridges of Nepal.
Importing libraries
import pandas as pd
import re
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
sns.set(style="darkgrid")
pd.options.display.max_columns = None
df = pd.read_csv('data.csv', index_col='S.No.')
Data Preview
df.head()
Bridge Number | Bridge Name | Road Name | District | River/Stream | Chainage(Km) | Length(m) | Width(m) | Span No | Foundation Type | Loading Capacity | Maintenance Division | Region | Completion Year | Cordinate | Bridge Type | Bridge Condition | Total Score | Load Restriction | Construction Status | Span Length(m) | Data Updated Year | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
S.No. | ||||||||||||||||||||||
1 | 04-H001-004 | Ninda Khola | Mahendra Rajmarga | Jhapa | Ninda | 5.46 | 318.60 | RW-7.9 | CW-7 | 12.0 | RCC Foundation | IRC class A/AA | Damak | Eastern | 4 | 26.6602 | 88.1072 | RCC T-Beam | 5 | 3.6 | 0.0 | Completed | 26.55 | 2017 |
2 | 04-H001-003 | Pali | Mahendra Rajmarga | Jhapa | Pali Khola | 3.44 | 49.60 | RW-7.8 | CW-7 | 3.0 | Well Foundation | IRC class A/AA | Damak | Eastern | 3 | 26.6505 | 88.1368 | RCC T-Beam | 7 | 3.1 | 0.0 | Completed | 16.5 | 2017 |
3 | 04-H001-028 | Jhiljile | Mahendra Rajmarga | Jhapa | Jhiljhile | 36.64 | 5.75 | RW-10.6 | CW-9.8 | 1.0 | Natural Rock | IRC class A/AA | Damak | Eastern | 28 | 26.6433 | 87.8071 | RCC Slab | 7 | 3.1 | 0.0 | Completed | 5.75 | 2017 |
4 | 04-H001-001 | Mechi | Mahendra Rajmarga | Jhapa | Mechi | 0.00 | 583.00 | RW-7.86 | CW-7 | 20.0 | RCC Foundation | IRC class A/AA | Damak | Eastern | 1 | 26.6440 | 88.1638 | RCC T-Beam | 6 | 2.7 | 0.0 | Completed | 29.15 | 2017 |
5 | 04-H001-031 | Chyangri | Mahendra Rajmarga | Jhapa | Chyangri | 42.25 | 6.70 | RW-10.6 | CW-9.7 | 1.0 | Natural Rock | NaN | Damak | Eastern | 31 | 26.6494 | 87.7619 | RCC Slab | 7 | 3.6 | 0.0 | Completed | 6.7 | 2017 |
Renaming and Droping Columns
df.columns
Index(['Bridge Number', 'Bridge Name', 'Road Name', 'District', 'River/Stream',
'Chainage(Km)', 'Length(m)', 'Width(m)', 'Span No', 'Foundation Type',
'Loading Capacity', 'Maintenance Division', 'Region', 'Completion Year',
'Cordinate', 'Bridge Type', 'Bridge Condition', 'Total Score',
'Load Restriction', 'Construction Status', 'Span Length(m)',
'Data Updated Year'],
dtype='object')
def format_column(col):
col = col.lower()
col = col.replace(")","")
col = re.sub(r'[/(\s+]', '_', col)
return col
df.columns = [format_column(col) for col in df]
df.columns
Index(['bridge_number', 'bridge_name', 'road_name', 'district', 'river_stream',
'chainage_km', 'length_m', 'width_m', 'span_no', 'foundation_type',
'loading_capacity', 'maintenance_division', 'region', 'completion_year',
'cordinate', 'bridge_type', 'bridge_condition', 'total_score',
'load_restriction', 'construction_status', 'span_length_m',
'data_updated_year'],
dtype='object')
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1932 entries, 1 to 1932
Data columns (total 22 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 bridge_number 1932 non-null object
1 bridge_name 1932 non-null object
2 road_name 1932 non-null object
3 district 1932 non-null object
4 river_stream 1932 non-null object
5 chainage_km 1932 non-null float64
6 length_m 1932 non-null float64
7 width_m 1932 non-null object
8 span_no 1875 non-null float64
9 foundation_type 1721 non-null object
10 loading_capacity 496 non-null object
11 maintenance_division 1909 non-null object
12 region 1932 non-null object
13 completion_year 1932 non-null int64
14 cordinate 1932 non-null object
15 bridge_type 1875 non-null object
16 bridge_condition 1932 non-null int64
17 total_score 1932 non-null float64
18 load_restriction 1585 non-null float64
19 construction_status 1932 non-null object
20 span_length_m 1875 non-null object
21 data_updated_year 1932 non-null int64
dtypes: float64(5), int64(3), object(14)
memory usage: 347.2+ KB
df.drop(['bridge_number','chainage_km','width_m','span_no','foundation_type','loading_capacity','maintenance_division','completion_year','cordinate','total_score','load_restriction','span_length_m','data_updated_year'], axis=1, inplace=True)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1932 entries, 1 to 1932
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 bridge_name 1932 non-null object
1 road_name 1932 non-null object
2 district 1932 non-null object
3 river_stream 1932 non-null object
4 length_m 1932 non-null float64
5 region 1932 non-null object
6 bridge_type 1875 non-null object
7 bridge_condition 1932 non-null int64
8 construction_status 1932 non-null object
dtypes: float64(1), int64(1), object(7)
memory usage: 150.9+ KB
Data Exploration
A. Frequency Statistics
1. Count of bridges by region
sns.countplot(x='region', data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x7f736c28f048>
2. Count of bridges by type
plt.figure(figsize=(16, 6))
sns.countplot(y='bridge_type', data=df)
<matplotlib.axes._subplots.AxesSubplot at 0x7f7369b50240>
3. Count of RCC T-Beam bridges by region
plt.figure(figsize=(16, 6))
sns.countplot(x='region', data=df[df.bridge_type == 'RCC T-Beam'])
<matplotlib.axes._subplots.AxesSubplot at 0x7f7369ac9080>
4. Count of bridges by district
plt.figure(figsize=(16, 6))
fig = sns.countplot(x='district', data=df)
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
df.district.value_counts()
Saptari 99
Kailali 99
Dang 89
Sindhuli 70
Bardiya 66
..
Tehrathum 4
Dadeldhura 4
Taplejung 3
Jumla 2
Okhaldhunga 1
Name: district, Length: 70, dtype: int64
Saptari and Kailali districts have the highest number of bridges i.e. 99 whereas Okhaldhunga district only has 1.
5. Count of different types of bridges in Saptari district
plt.figure(figsize=(16, 6))
sns.countplot(x='bridge_type', data=df[df.district == 'Saptari'])
<matplotlib.axes._subplots.AxesSubplot at 0x7f7369a4e550>
6. Count of bridges in my hometown, Lalitpur
df[df.district == 'Lalitpur'].district.value_counts()
Lalitpur 8
Name: district, dtype: int64
7. Count of bridges by construction status
df.construction_status.value_counts()
Completed 1724
Under Construction 208
Name: construction_status, dtype: int64
8. Count of completed bridges by condition
Condition Scale (0-10)
- 0 - Critical Condition- Facility is Closed and Is Beyond Repair
- 1 - Critical condition - facility is closed. Study should the feasibility for repair
- 2 - Critical condition - need for repair or rehabilitation urgent. Facility should be closed until the indicated repair is completed
- 3 - Poor condition— repair or rehabilitation required immediately
- 4 - Marginal condition—potential exists for major rehabilitation
- 5 - Generally fair condition—potential exists for minor rehabilitation
- 6 - Fair condition—potential exists for major maintenance
- 7 - Generally good condition—potential exists for minor maintenance
- 8 - Good condition—no repairs needed
- 9 - New Condition
- 10 - Not Applicable
plt.figure(figsize=(16, 6))
sns.countplot(x='bridge_condition', data=df[df.construction_status == 'Completed'], log=True)
<matplotlib.axes._subplots.AxesSubplot at 0x7f73696e0710>
B. Descriptive Statistics
1. Data Info
df.describe()
length_m | bridge_condition | |
---|---|---|
count | 1932.000000 | 1932.000000 |
mean | 45.580683 | 7.237060 |
std | 76.682149 | 1.300804 |
min | 0.000000 | 0.000000 |
25% | 12.000000 | 7.000000 |
50% | 24.000000 | 7.000000 |
75% | 50.000000 | 8.000000 |
max | 1149.000000 | 10.000000 |
# Replacing rows with value 0 with NaN
df = df.replace(0.0, np.NaN)
df.describe()
length_m | bridge_condition | |
---|---|---|
count | 1925.000000 | 1932.000000 |
mean | 45.746431 | 7.237060 |
std | 76.772124 | 1.300804 |
min | 5.550000 | 0.000000 |
25% | 12.000000 | 7.000000 |
50% | 24.000000 | 7.000000 |
75% | 50.000000 | 8.000000 |
max | 1149.000000 | 10.000000 |
The average length of bridges in ~46 meters.
The average condition of the bridges is a 7 i.e. they are in good condition.
The length of the bridges range from 5.5 m to 1149 m.
2. Longest and Shortest Bridge
df[df.length_m == 1149]
bridge_name | road_name | district | river_stream | length_m | region | bridge_type | bridge_condition | construction_status | |
---|---|---|---|---|---|---|---|---|---|
S.No. | |||||||||
97 | Koshi Barrage | Mahendra Rajmarga | Saptari | Koshi Barrage | 1149.0 | Eastern | RCC T-Beam | 10 | Completed |
The Koshi Barrage bridge in Saptari district is the longest one with a length of 1149 meters.
df[df.length_m == 5.55]
bridge_name | road_name | district | river_stream | length_m | region | bridge_type | bridge_condition | construction_status | |
---|---|---|---|---|---|---|---|---|---|
S.No. | |||||||||
1817 | Ankuse khola | Janakpur Circumambulatory | Mahottari | Ankuse khola | 5.55 | Central | RCC Slab | 7 | Completed |
The Ankuse Khola bridge in Mahottari district is the shortest one with a length of 5.5 meters.
3. Total bridges with length above 100 m
df[df.length_m > 100].shape[0]
176
4. Top 10 Longest and Shortest
a. Top 10 Longest
df.sort_values(by=['length_m'], ascending=False).head(10)
bridge_name | road_name | district | river_stream | length_m | region | bridge_type | bridge_condition | construction_status | |
---|---|---|---|---|---|---|---|---|---|
S.No. | |||||||||
97 | Koshi Barrage | Mahendra Rajmarga | Saptari | Koshi Barrage | 1149.0 | Eastern | RCC T-Beam | 10 | Completed |
75 | Mahuli | Mahendra Rajmarga | Saptari | Mahuli - 1 | 1100.0 | Eastern | RCC Slab | 8 | Completed |
1013 | Karnali (Geruwa) Bridge | Postal Highway | Bardiya | Geruwa Khola | 1015.0 | Mid-Western | RCC T-Beam | 9 | Completed |
866 | Thulo mai | Postal Highway | Jhapa | Thulo mai khola | 800.0 | Eastern | NaN | 10 | Under Construction |
11 | Kankai | Mahendra Rajmarga | Jhapa | Kankai | 702.0 | Eastern | RCC T-Beam | 7 | Completed |
123 | Kamala | Mahendra Rajmarga | Siraha | Kamala | 640.0 | Eastern | RCC T-Beam | 8 | Completed |
926 | Bagmati | Postal Highway | Rautahat | Bagmati river | 633.0 | Central | RCC T-Beam | 10 | Under Construction |
20 | Ratuwa | Mahendra Rajmarga | Jhapa | Ratuwa | 585.0 | Eastern | RCC T-Beam | 6 | Completed |
4 | Mechi | Mahendra Rajmarga | Jhapa | Mechi | 583.0 | Eastern | RCC T-Beam | 6 | Completed |
868 | Mechi | Postal Highway | Jhapa | Mechi Khola | 560.0 | Eastern | RCC T-Beam | 10 | Under Construction |
b. Top 10 Longest Completed
df_sorted_length = df[df.construction_status == 'Completed'].sort_values(by=['length_m'], ascending=False)
df_sorted_length.head(10)
bridge_name | road_name | district | river_stream | length_m | region | bridge_type | bridge_condition | construction_status | |
---|---|---|---|---|---|---|---|---|---|
S.No. | |||||||||
97 | Koshi Barrage | Mahendra Rajmarga | Saptari | Koshi Barrage | 1149.00 | Eastern | RCC T-Beam | 10 | Completed |
75 | Mahuli | Mahendra Rajmarga | Saptari | Mahuli - 1 | 1100.00 | Eastern | RCC Slab | 8 | Completed |
1013 | Karnali (Geruwa) Bridge | Postal Highway | Bardiya | Geruwa Khola | 1015.00 | Mid-Western | RCC T-Beam | 9 | Completed |
11 | Kankai | Mahendra Rajmarga | Jhapa | Kankai | 702.00 | Eastern | RCC T-Beam | 7 | Completed |
123 | Kamala | Mahendra Rajmarga | Siraha | Kamala | 640.00 | Eastern | RCC T-Beam | 8 | Completed |
20 | Ratuwa | Mahendra Rajmarga | Jhapa | Ratuwa | 585.00 | Eastern | RCC T-Beam | 6 | Completed |
4 | Mechi | Mahendra Rajmarga | Jhapa | Mechi | 583.00 | Eastern | RCC T-Beam | 6 | Completed |
1019 | Karnali(satighat pul) | Postal Highway | Kailali | Karnali(satighat pul) | 531.00 | Far- Western | RCC T-Beam | 8 | Completed |
394 | Karnali | Mahendra Rajmarga | Bardiya | Karnali | 500.00 | Mid-Western | Cable Stayed | 7 | Completed |
73 | Balan | Mahendra Rajmarga | Saptari | Balan | 479.03 | Eastern | RCC T-Beam | 7 | Completed |
plt.figure(figsize=(16, 6))
fig = sns.barplot(x="bridge_name", y="length_m", data=df_sorted_length.head(10))
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
c. Top 10 Shortest
df_sorted_length.tail(10).sort_values(by=['length_m'])
bridge_name | road_name | district | river_stream | length_m | region | bridge_type | bridge_condition | construction_status | |
---|---|---|---|---|---|---|---|---|---|
S.No. | |||||||||
1817 | Ankuse khola | Janakpur Circumambulatory | Mahottari | Ankuse khola | 5.55 | Central | RCC Slab | 7 | Completed |
1809 | Odigad Khola | Nagma - Gamgadhi | Jumla | Odigad Khola | 5.65 | Mid-Western | RCC Slab | 7 | Completed |
3 | Jhiljile | Mahendra Rajmarga | Jhapa | Jhiljhile | 5.75 | Eastern | RCC Slab | 7 | Completed |
738 | Aringale (Muru) Khola | Rapti Highway | Rukum | Aringale (Muru) Khola | 5.90 | Mid-Western | RCC Slab | 7 | Completed |
928 | Maraha | Postal Highway | Rautahat | Maraha khola | 6.00 | Central | Arch Brick Masonry | 7 | Completed |
1382 | gharamadi khola | Pokhara - Baglung - Beni - Jomsom | Myagdi | Gharamdi Khola | 6.00 | Western | RCC Slab | 7 | Completed |
1371 | Phedi Khola | Pokhara - Baglung - Beni - Jomsom | Kaski | Phedi khola | 6.00 | Western | RCC Slab | 7 | Completed |
1387 | Bhadra (Bhyaple) khola | Pokhara - Baglung - Beni - Jomsom | Parbat | Bhadra (Bhyaple) khola | 6.00 | Western | RCC Slab | 6 | Completed |
884 | Larikatta | Postal Highway | Morang | Larikatta | 6.05 | Eastern | RCC Slab | 6 | Completed |
1237 | Pathariya kulo | Junga - Rajapur | Kailali | Pathariya kulo | 6.10 | Far- Western | RCC Slab | 7 | Completed |
plt.figure(figsize=(16, 6))
fig = sns.barplot(x="bridge_name", y="length_m", data=df_sorted_length.tail(10).sort_values(by=['length_m']))
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
5. Districts with the most longest bridges in top 100
plt.figure(figsize=(16, 6))
fig = sns.countplot(x='district', data=df_sorted_length.head(100))
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
6. Districts with the most bridges above 100m
plt.figure(figsize=(16, 6))
fig = sns.countplot(x='district', data=df[df.length_m > 100])
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
7. Road with the most bridges above 100m
plt.figure(figsize=(16, 6))
fig = sns.countplot(x='road_name', data=df[df.length_m > 100])
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
8. Bridge type with the most bridges above 100m
plt.figure(figsize=(16, 6))
fig = sns.countplot(x='bridge_type', data=df[df.length_m > 100])
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
9. Total length of all the bridges (in m)
df.length_m.sum()
88061.87999999999
10. Total length of all the bridges by district (in m)
plt.figure(figsize=(16, 6))
fig = sns.barplot(x='district',y='length_m', data=df.groupby(df.district, as_index=False).sum())
plt.xticks(rotation = 65, horizontalalignment='right')
plt.show()
11. Top 10 districts with most bridge length
df.groupby(df.district, as_index=False).length_m.sum().sort_values(by=['length_m'], ascending=False).head(10)
district | length_m | |
---|---|---|
58 | Saptari | 7150.47 |
25 | Jhapa | 6072.39 |
27 | Kailali | 4996.96 |
60 | Sindhuli | 3975.85 |
14 | Dang | 3409.60 |
69 | Udayapur | 2987.08 |
8 | Bardiya | 2967.20 |
39 | Morang | 2607.46 |
18 | Dhanusha | 2583.90 |
42 | Nawalparasi | 2376.31 |
12. Longest bridge of each district
pd.set_option('display.max_rows', None)
df.loc[df.groupby('district')['length_m'].idxmax()].sort_values(by='district')[['district','bridge_name','length_m']]
district | bridge_name | length_m | |
---|---|---|---|
S.No. | |||
1123 | Achham | Karnali | 200.00 |
213 | Arghakhanchi | Rana Sing | 103.20 |
1089 | Baglung | Kaligandaki pul | 114.00 |
831 | Baitadi | Surnaya Gad River | 41.00 |
1459 | Bajhang | Bhahuligad | 77.00 |
1787 | Bajura | Gui Gad River | 61.00 |
1778 | Banke | Rapti Khola | 342.00 |
195 | Bara | Bakeya | 355.59 |
1013 | Bardiya | Karnali (Geruwa) Bridge | 1015.00 |
1648 | Bhaktapur | Hanumante Khola | 45.00 |
1061 | Bhojpur | Arun Khola | 120.00 |
208 | Chitawan | Narayani pul | 420.00 |
1803 | Dadeldhura | Puntura Gad khola | 153.35 |
810 | Dailekh | Lohare Khola | 118.20 |
1756 | Dang | Rapti Khola | 404.00 |
829 | Darchula | Chameliya River | 121.80 |
1327 | Dhading | Trisuli River | 118.00 |
675 | Dhankuta | Tamor | 200.00 |
136 | Dhanusha | Aurahi | 329.00 |
1305 | Dolakha | Malu | 78.00 |
837 | Doti | Seti River | 164.20 |
1905 | Gorkha | Trisuli River | 152.25 |
1731 | Gulmi | Body-guard | 164.00 |
658 | Ilam | Mai Khola | 53.70 |
1439 | Jajarkot | Chedagad Khola | 130.00 |
866 | Jhapa | Thulo mai | 800.00 |
788 | Jumla | Umgad Khola | 7.80 |
1019 | Kailali | Karnali(satighat pul) | 531.00 |
793 | Kalikot | Ghatte Khola | 40.00 |
471 | Kanchanpur | Banara River | 240.80 |
308 | Kapilbastu | Banganga | 290.00 |
563 | Kaski | Seti khola pul | 180.00 |
1657 | Kathmandu | Bagmati | 156.05 |
514 | Kavrepalanchowk | Indrawati | 164.00 |
1062 | Khotang | Pankhu Khola | 15.00 |
1269 | Lalitpur | Karmanasa | 42.00 |
1821 | Lamjung | Midim Khola | 87.00 |
643 | Mahottari | Ratu | 270.00 |
167 | Makawanpur | Rapti | 210.00 |
36 | Morang | Lohendra | 385.20 |
1379 | Mustang | Syang Khola | 115.00 |
1733 | Myagdi | Kaligandaki Khola | 76.40 |
240 | Nawalparasi | Binai Khola | 246.00 |
1636 | Nuwakot | Tadi River | 75.00 |
1067 | Okhaldhunga | Dudh Koshi | 120.00 |
733 | Palpa | Kaligandaki | 93.00 |
656 | Panchthar | Hengwa | 45.70 |
1389 | Parbat | Modi khola (Dimuwa) | 61.80 |
942 | Parsa | Shikharivas | 255.00 |
1208 | Pyuthan | jhimruk | 144.00 |
1619 | Ramechhap | Sunkoshi | 100.00 |
1258 | Rasuwa | Runga | 100.00 |
926 | Rautahat | Bagmati | 633.00 |
1861 | Rolpa | thawang Khola Bridge | 168.00 |
1112 | Rukum | Muglu Khola | 48.50 |
274 | Rupandehi | Tinau Khola | 226.50 |
1761 | Salyan | Sharada nadi | 104.00 |
1483 | Sankhuwasabha | Sawa Khola | 121.00 |
97 | Saptari | Koshi Barrage | 1149.00 |
158 | Sarlahee | Lakhandei | 204.55 |
615 | Sindhuli | Khalte/Nigule khola | 191.00 |
1278 | Sindhupalchowk | Indrawati | 105.83 |
123 | Siraha | Kamala | 640.00 |
55 | Sunsari | Budhi | 128.40 |
764 | Surkhet | Babai Khola | 222.20 |
711 | Syangja | Aarmadi Khola | 93.25 |
588 | Tanahu | Madi khola | 370.00 |
653 | Taplejung | Kaveli | 98.20 |
1054 | Tehrathum | Tamor | 200.00 |
1921 | Udayapur | Koshi Bridge | 261.30 |
Data
- Source: List of Main Bridges of SRN, harvested from Government of Nepal, Department of Roads, Road Network
- Link: Data
- Year: 2017
- Retrieved: April 09, 2020
You can find the executable Jupyter Notebook here.